UNIQUE约束失败

时间:2018-06-07 17:54:31

标签: django

我和Django一起经历Tango,我无法解决这个问题。 我收到django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category.name错误。这是在我尝试将views属性实现到Category对象之后。这是我的数据库填充脚本的摘录。我可能应该makemigrations然后migrate更新数据库模型。但是,这没有帮助。

    cats = {
    'Python' : {'pages': python_pages, 'views':128},
    'Django': {'pages': django_pages, 'views':128},
    "Other Frameworks": {'pages':other_pages, 'views':128},
    }

for cat, cat_data in cats.items():
    c = add_cat(cat, cat_data['views'])
    for p in cat_data["pages"]:
        add_page(c, p['title'], p['url'])

for c in Category.objects.all():
    for p in Page.objects.filter(category=c):
        print("- {0} - {1}".format(str(c), str(p)))

def add_cat(name, views):
    c = Category.objects.get_or_create(name=name, views=views)[0]
    c.views=views
    c.save()
    return c

添加Category型号:

class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
views = models.IntegerField(default=0)



class Meta:
    verbose_name_plural = 'Categories'

def __str__(self):
        return self.name

2 个答案:

答案 0 :(得分:3)

您收到错误,因为unique = True中的name = models.CharField(max_length=128, unique=True)表示Django会引发约束错误 UNIQUE约束失败,以防您尝试使用相同的{{保存新实例1}}价值;违反了唯一约束

name不起作用,因为即使get_or_create等于views=views

name可能会有所不同

当您namecreate您的实例时,您只能使用get字段

name

答案 1 :(得分:1)

正如评论中所述,错误是由违反Category.name上的唯一约束引起的。然而,发生这种情况的原因可能并不完全明显。当您致电Category.objects.get_or_create时,您要求django查找具有给定名称​​和给定数量的视图的对象。如果找不到一个,那么django会尝试创建一个,如果已经存在同名的Category但视图数量不同,则会违反唯一约束。根据所需的行为,您可以通过以下任一方式进行修复:

  • 完全删除唯一约束
  • 将唯一约束更改为unique_together constraint
  • 将模型引用更改为先按名称获取或创建,然后设置(或修改)views属性(不要忘记保存)