我的应用程序很少,允许用户对视频进行评分。
用户只能评分一次。 所以我已经定义了模型的唯一性。
但他应该可以改变他的比率。
因此,save()
应在重复密钥
class VideoRate(models.Model):
"""Users can Rate each Video on the criterias defined for the topic"""
user = models.ForeignKey(User)
video = models.ForeignKey(VideoFile)
crit = models.ForeignKey(VideoCrit)
rate = models.DecimalField(max_digits=2, decimal_places=1, choices=RATE_CHOICES)
class Meta:
unique_together = (('user', 'video', 'crit'),)
verbose_name = 'Video Rating'
如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=2)
rate.save()
它正在保存评级,但如果我
rate = VideoRate(user_id=1, video_id=1, crit_id=1, rate=3)
rate.save()
我收到正常错误
IntegrityError: (1062, "Duplicate entry '1-1-1' for key 'user_id'")
即使我使用force_update=True
(因为仅基于主键)
有没有办法更新评级,如果它已经存在而不必在之前检查数据?
答案 0 :(得分:31)
要更新现有评级,您实际上必须拥有要更新的评级。如果您知道该对象可能不存在,请使用get_or_create
:
rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1)
rate.rate = 2
rate.save()
您可以使用update()
:
VideoRate.objects.filter(user_id=1, video_id=1, crit_id=1).update(rate=2)
但如果评级不存在,这将无声地失败 - 它不会创建一个。
答案 1 :(得分:8)
首先,您必须检查评级是否存在。因此,您可以使用 Daniel Roseman 所说的内容或使用存在,但是您无法通过简单的更新解决此问题,因为更新不会创建新记录......
rating = 2
rate, created = VideoRate.objects.get_or_create(user_id=1, video_id=1, crit_id=1,
defaults={'rate':rating})#if create, also save the rate infdormation
if not created:# update
rate.rate = rating
rate.save()
您可以使用默认值来传递exrta参数,因此如果是插入,则会创建包含所有必需信息的数据库记录,您无需更新再次...
更新:这个答案很老,就像问题一样。正如@peterthomassen所说,Django现在有update_or_create()方法