我和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
答案 0 :(得分:3)
您收到错误,因为unique = True
中的name = models.CharField(max_length=128, unique=True)
表示Django会引发约束错误 UNIQUE约束失败,以防您尝试使用相同的{{保存新实例1}}价值;违反了唯一约束
name
不起作用,因为即使get_or_create
等于views=views
name
可能会有所不同
当您name
或create
您的实例时,您只能使用get
字段
name
答案 1 :(得分:1)
正如评论中所述,错误是由违反Category.name
上的唯一约束引起的。然而,发生这种情况的原因可能并不完全明显。当您致电Category.objects.get_or_create
时,您要求django查找具有给定名称和给定数量的视图的对象。如果找不到一个,那么django会尝试创建一个,如果已经存在同名的Category
但视图数量不同,则会违反唯一约束。根据所需的行为,您可以通过以下任一方式进行修复:
unique_together
constraint