2015-07-19 56 views
2

我的一个视图的任务是将多个值插入到我的数据库中。我的印象是,如果我建立我的模型具有独特vendor_name S:使用Django和Postgresql的重复条目

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... 
+0

根据文档:如果为True,则该字段在整个表格中必须是唯一的。 这是在数据库级别和模型验证实施的。如果您尝试在唯一字段中保存具有重复值的模型,则模型的save()方法将引发django.db.IntegrityError。 –

+0

为什么不使用外键代替,因为似乎有一个Vendor模型 – Pynchia

+0

所以是的,它应该不会重复。你有没有应用迁移? –

回答

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) 
0

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

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

未应用迁移unique将不起作用。