【问题标题】:Duplicate entries with Django and Postgresql使用 Django 和 Postgresql 重复条目
【发布时间】:2015-10-08 11:35:16
【问题描述】:

我的一个视图的任务是在我的数据库中插入几个值。我的印象是,如果我用独特的vendor_names 设置我的模型:

class Page(models.Model):
  vendor_name = models.CharField(max_length=128, unique=True)
  website = models.CharField(max_length=128)
  food_type = models.CharField(max_length=128)
  img_url = models.CharField(max_length=128)

如果我这样做了:

  for vendor in vendors:
    c = Page(vendor_name=vendor["name"], 
             website=vendor["link"], 
             food_type=vendor["type"],
             img_url=vendor["imageurl"])
    c.save()

将跳过重复的外观,我将在数据库中只有一个副本。至少这是我从here 了解到的。而不是这个,我必须添加一个 if 语句来检查我的数据库中的每个条目并查看它当前是否在那里,如果它没有插入,否则跳过。或者我在这里错过了什么?唯一约束的目的是什么?是否只是在有重复时抛出错误?我可以利用这个来代替吗?

我得到的错误是

Exception Value: duplicate key value violates unique constraint...

【问题讨论】:

  • 根据文档:If True, this field must be unique throughout the table. This is enforced at the database level and by model validation. If you try to save a model with a duplicate value in a unique field, a django.db.IntegrityError will be raised by the model’s save() method.
  • 为什么不使用外键,因为似乎有一个 Vendor 模型
  • 所以是的,它应该不会重复。您是否有未应用的迁移?
  • @AndréFratelli 我最近的迁移已被应用。我得到一个错误。见上文。
  • @Pynchia 没有供应商模型,但你能解释一下使用外键对我有什么帮助吗?供应商来自一个对象数组。

标签: python django postgresql


【解决方案1】:

在 Django 中,unique 强制对条目进行数据库级别的验证,因此如果您在创建表后将该属性添加到模型的字段中,即使您执行 syncdb,也不会将唯一条件添加到您的表中稍后在某个时候。

如果您不想创建具有相同 vendor_name 的行,则应使用 Page.objects.get_or_crate 让 Django 仅在不存在时使用该供应商名称创建 Page 对象:

for vendor in vendors:
    page, created = Page.objects.get_or_create(
        vendor_name=vendor['name'], 
        defaults={'website': vendor['link'], 
                  'food_type': vendor['type'], 
                  'img_url': vendor['imageurl'])

    if created:
        print('Page created: ', page)

【讨论】:

    【解决方案2】:

    您有未应用的迁移。您获得Exception Value: duplicate key value violates unique constraint 的事实意味着您需要在应用迁移之前从数据库中清除重复项。您不能只添加已经被违反的约束。

    如果可以选择,请从数据库中删除整个表并尝试再次应用您的迁移。如果这不是一个选项,您需要删除重复项并在之后应用迁移。

    不应用迁移unique 将无法工作。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 2021-12-25
      • 2021-12-16
      • 2014-08-14
      • 1970-01-01
      • 2015-12-08
      • 2016-08-30
      • 2013-04-24
      相关资源
      最近更新 更多