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
在日志中没有错误,这个代码无法正常工作,或者我应该在其他地方搜索问题?
答案 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
。