1

を呼び出すとUser.create_user、次のエラーが表示されます。

IntegrityError at /login
users_user.status_id may not be NULL

注: SO に関する他の IntegrityError の質問を多数確認しましたが、この問題を修正できませんでした。

私のモデルは次のようになります。

class Status(models.Model):
    status = models.CharField(max_length=200)
    status_time = models.DateTimeField('date published')

    def __init__(self, status = '', time=timezone.datetime.min, *args, **kwargs):
        self.status = status
        self.status_time = time
        super(Status, self).__init__(*args, **kwargs)

    def set_status(self, s):
        self.status = s
        self.status_time = timezone.datetime.now()
        self.save()

    def get_status(self):
        now = timezone.datetime.now()
        if now-self.status_time<datetime.timedelta(minutes=15):
            return self.status
        return None

class User(models.Model):
    facebook_id = models.CharField(max_length=200)
    friends = ListField()
    status = models.OneToOneField(Status)

    @classmethod
    def create_user(cls, fid, friends):
        k = User()
        k.facebook_id = fid
        k.friends = friends
        k.save() #THE PROBLEM IS HERE
        k.status = Status()
        k.status.set_status('')
        k.status.save()
        k.save()

また、 User.status_id が何を表しているのかまだわかりません。なぜそこにあり、なぜそれができないのNoneでしょうか?

4

1 に答える 1

3

あなたの問題は、ユーザーを未作成のステータスで保存することです。最初にステータスを作成してから、ユーザーを保存できます。

   def create_user(cls, fid, friends):
        k = User()

        k.status = Status()
        k.status.set_status('') # set_status saves the status

        k.facebook_id = fid
        k.friends = friends
        k.save()

またはさらに良い:

   def create_user(cls, fid, friends):
        status = Status()
        status.set_status('')
        User.objects.create(facebook_id=fid, friends=friends, status=status)

 

慣用的な django コードでは、次のようなメソッドcreate_userはモデルのマネージャーにある必要があります。

class UserManager(models.Manager):
    def create_user(self, fid, friends):
        status = Status()
        status.set_status('')
        return self.create(facebook_id=fid, friends=friends, status=status)


class User(models.Model):
    facebook_id = models.CharField(max_length=200)
    friends = ListField()
    status = models.OneToOneField(Status)

    objects = UserManager()

次に、次のように呼び出します。

new_user = User.objects.create_user(fid, friends)

 

objects.create次に、デフォルトのステータスがあれば、 builtin を使用できたことに気付きます。

# A custom manager is no longer needed

class User(models.Model):
    facebook_id = models.CharField(max_length=200)
    friends = ListField()
    status = models.OneToOneField(Status)

    def save(self, *a, **kw):
        # if this user doesn't have a status yet, create an empty one
        if self.status is None:
            self.status = Status()
            self.status.set_status('')

        super(User, self).save(*a, **kw)

# creating users:

new_user = User.objects.create(facebook_id=fid, friends=friends)

# status is set to an empty one automatically in save
于 2013-03-29T22:12:12.237 に答える