无法更新Django 1.8的IntegerField值

时间:2016-12-04 14:03:45

标签: python django

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    how_many_new_notifications = models.IntegerField(null=True,blank=True,default=0)
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

在views.py函数中,100%调用并且whom存在

whom.profile.how_many_new_notifications += 1
whom.save()

无论如何,尽管其他一切都是正确的,how_many_new_notifications仍然等于零并且没有受到指控

也试过这样的事情:

  if  whom.profile.how_many_new_notifications  ==  None:
            whom.profile.how_many_new_notifications = 1
  else:
            varible_number_of_notifications = int(  whom.profile.how_many_new_notifications)
            whom.profile.how_many_new_notifications = varible_number_of_notifications  + 1

在日志中没有错误,这个代码无法正常工作,或者我应该在其他地方搜索问题?

1 个答案:

答案 0 :(得分:5)

User.profile是一个属性,每次使用时都会获取配置文件的新副本。

所以当你这样做时

user.profile.how_many_notifications += 1
user.profile.save()

每一行都使用自己的配置文件副本,这两个Python对象是不相关的。

所以你需要做

profile = user.profile
profile.how_many_notifications += 1
profile.save()

但是使用像这样的配置文件属性有点奇怪 - 你有一个OneToOneField,并且相关的属性已经被自动定义为你的类的小写名称。所以

user.userprofile.how_many_new_notifications += 1
user.userprofile.save()

也应该有效。如果您想更改名称userprofile,请使用related_name

user = models.OneToOneField(User, related_name='profile')

然后它适用于user.profile