当我想在Djnago中的Post模型中添加一个名为slug的新字段时,migrate命令将引发UNIQUE constraint failed: new__chat_post.slug
之后,我从我的模型中删除了那个字段,但问题仍然存在。为什么?以及如何在不删除我的整个表数据的情况下解决这个问题??
数据库是sqlite3,Django版本是2.2。
谢谢。
型号:
class Post(models.Model):
title = models.TextField(max_length=100)
context = models.TextField(max_length=255)
creation_date = models.DateTimeField(default = timezone.now)
author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete = models.CASCADE)
slug = models.SlugField(default=["title"],unique=True)
出现此错误是因为Django的makemigrations
命令生成的迁移试图为数据库中已存在的Post
模型的每个实例设置默认值"title"
。但由于该字段被标记为unique=True
,因此此操作将失败。
为了解决这个问题,您可以手动修改自动生成的迁移,从而防止Django试图为每个实例分配相同的值,并编写自己的逻辑,为每个预先存在的实例的字段slug
分配唯一的值。
您可以通过多个步骤实现这一点:
-
添加";鼻涕虫";字段添加到您的模型,而没有";unique=True";限制
-
Do"makemigrations";以及";迁移";。
-
进入SQLite并使用一些SQL来设置每个";鼻涕虫";字段设置为唯一值,例如:
update app_post set slug=title;
-
将";unique=True";约束到模型中。
-
再做一次";makemigrations";以及";迁移";。
完成!
说明:在任何情况下都不会违反唯一约束(假设您的"标题"字段具有唯一值(。