【问题标题】:Django won't let me save a User objectDjango 不允许我保存用户对象
【发布时间】:2013-03-20 16:23:33
【问题描述】:

当我调用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

【问题讨论】:

    标签: python django django-models python-2.7


    【解决方案1】:

    您的问题是您将用户保存为未创建状态。先创建状态,再保存用户:

       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,只要有一个默认状态:

    # 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
    

    【讨论】:

    • 完美!这就像一个魅力。实际上我对同一个项目还有另一个问题,既然你似乎对此很了解,我想知道你是否也可以帮助我?在stackoverflow.com/questions/15712582/… 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2014-02-21
    • 2012-06-23
    • 2020-08-31
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多