Django - save() 更新重复键

标签 django save unique-constraint insert-update

我几乎没有允许用户对视频进行评分的应用程序。

用户只能评价一次。
所以我已经定义了模型的唯一性。

但他应该能够改变他的利率。
所以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 (因为仅基于主键)

如果评级已经存在,有没有办法更新评级而无需事先检查数据?

最佳答案

要更新现有评级,您实际上必须拥有要更新的评级。如果您知道该对象可能不存在,请使用 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)

但是,如果评级不存在,这将无声地失败 - 它不会创建评级。

关于Django - save() 更新重复键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382806/

相关文章:

android - 需要一个最小的 Django 数据存储示例

nhibernate - 为什么 Fluent NHibernate 会忽略我对组件的唯一约束?

php - 如何使用 PDO 和 MySQL 在多个表中插入 INSERT INTO?

python - Django 1.1 和 Google 应用引擎有稳定的集成程序/插件吗?

django - 根据 View 传递的对象 ID 过滤表单上的外键选择选项

django - 为 QuerySet 手动选择数据库会覆盖 Django 中的数据库路由器方法吗?

java - 如何保存一些 TextView 并从另一个类加载它们?

php - 保存 ID 变为 0 后的 Laravel Eloquent

error-handling - 用cakephp保存数据不起作用

c# - 提取由 DbContext.OnModelCreating 在 IDatabaseInitializer 中创建的配置