在django中添加新模型字段时,UNIQUE约束失败



当我想在Djnago中的Post模型中添加一个名为slug的新字段时,migrate命令将引发UNIQUE constraint failed: new__chat_post.slug

之后,我从我的模型中删除了那个字段,但问题仍然存在。为什么?以及如何在不删除我的整个表数据的情况下解决这个问题??

数据库是sqlite3Django版本是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分配唯一的值。

您可以通过多个步骤实现这一点:

  1. 添加";鼻涕虫";字段添加到您的模型,而没有";unique=True";限制

  2. Do"makemigrations";以及";迁移";。

  3. 进入SQLite并使用一些SQL来设置每个";鼻涕虫";字段设置为唯一值,例如:

    update app_post set slug=title;

  4. 将";unique=True";约束到模型中。

  5. 再做一次";makemigrations";以及";迁移";。

完成!

说明:在任何情况下都不会违反唯一约束(假设您的"标题"字段具有唯一值(。

最新更新