Python 使用Django和Postgresql复制条目

Python 使用Django和Postgresql复制条目,python,django,postgresql,Python,Django,Postgresql,我的一个视图的任务是在数据库中插入几个值。我的印象是,如果我用唯一的vendor\u 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 = mode

我的一个视图的任务是在数据库中插入几个值。我的印象是,如果我用唯一的
vendor\u name
s设置模型:

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()
重复的外观将被跳过,数据库中只有一个副本。至少这是我从中学到的。相反,我必须添加一个if语句来检查我的数据库中的每个条目,看看它当前是否在那里,如果不是insert,否则跳过。还是我在这里遗漏了什么?唯一约束的目的是什么?当存在重复项时,是否只是抛出错误?我可以利用这个吗

我得到的错误是

Exception Value: duplicate key value violates unique constraint...
在Django中,强制对条目进行数据库级验证,因此,如果在创建表之后将该属性添加到模型的字段中,则即使稍后执行
syncdb
,也不会将唯一条件添加到表中

如果您不想创建具有相同
供应商名称的行
,则应使用
Page.objects.get\u或_cratet
让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)

您有未应用的迁移。您获得的
异常值:重复键值违反了唯一约束这一事实意味着您需要在应用迁移之前清除数据库中的重复项。不能只添加已被违反的约束

如果是这样,请从数据库中删除整个表,然后再次尝试应用迁移。如果这不是一个选项,您将需要删除复制,然后应用迁移


如果不应用迁移,
unique
将不起作用。

根据文档:
如果为True,则此字段在整个表中必须是唯一的。这是在数据库级别和通过模型验证实施的。如果您试图在唯一字段中保存具有重复值的模型,则该模型的save()方法将引发django.db.IntegrityError。
为什么不使用外键,因为似乎存在供应商模型?是的,应该不会重复。您是否有未应用的迁移?@AndréFratelli我最近的迁移已应用。不过我有个错误。如上所述。@Pynchia没有供应商模型,但您能解释一下使用外键对我有什么帮助吗?供应商来自一系列对象。