django.db.utils.IntegrityError:唯一约束失败:rango_category__new.slug
Posted
技术标签:
【中文标题】django.db.utils.IntegrityError:唯一约束失败:rango_category__new.slug【英文标题】:django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug 【发布时间】:2015-06-05 02:27:12 【问题描述】:我正在使用 Django 从 Tango 学习 Django,但我在键入时不断收到此错误:
python manage.py makemigrations rango
python manage.py migrate
这是输出:
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
模型.py:
from django.db import models
from django.template.defaultfilters import slugify
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
views = models.IntegerField(default=0)
likes = models.IntegerField(default=0)
slug = models.SlugField(unique=True)
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)
def __unicode__(self):
return self.name
class Page(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=128)
url = models.URLField()
views = models.IntegerField(default=0)
def __unicode__(self):
return self.title
【问题讨论】:
如果答案对您有用,则将其标记为已接受是一般的礼仪。我遇到了同样的问题,@ruddra'a 的答案对我有用。 【参考方案1】:这种约束的原因可能是当您最初迁移它(首次迁移)时,在 Category
类中没有任何名为 slug
的字段,并且在模型中添加此字段后,当您运行makemigrations
,您已将默认值设置为静态值(即 None
或 ''
等),这打破了 Category 表的 slug 列的唯一约束,其中 slug 应该是唯一的,但这并不是因为所有该条目将获得该默认值。
要解决此问题,您可以删除数据库和迁移文件并重新运行 makemigrations
和 migrate
或设置一个唯一的默认值,如下所示:
slug = models.SlugField(unique=True, default=uuid.uuid1)
编辑:
根据Migrations that add unique fields,修改您的迁移文件以克服独特的约束。例如,像这样修改您的迁移文件(将 slug 字段添加到模型中):
import uuid
from app.models import Category # where app == tango_app_name
class Migration(migrations.Migration):
dependencies = [
('yourproject', '0003_remove_category_slug'),
]
def gen_uuid(apps, schema_editor):
for row in Category.objects.all():
row.slug = uuid.uuid4()
row.save()
operations = [
migrations.AddField(
model_name='category',
name='slug',
field=models.SlugField(default=uuid.uuid4),
preserve_default=True,
),
migrations.RunPython(gen_uuid),
migrations.AlterField(
model_name='category',
name='slug',
field=models.SlugField(default=uuid.uuid4, unique=True),
),
]
【讨论】:
第一个在管理页面中给了我错误:u“在'CategoryForm'中找不到键'slug'”。我无法使用 uuid.uuid1,因为我不知道在哪里导入它,它给出的 'uuid' 没有定义。 对于第一个问题,检查这个:***.com/questions/2685383/hide-fields-in-django-admin,对于第二个,使用import uuid
,对于第二个解决方案,不要忘记从迁移目录中删除最后一个迁移文件(即@ 987654333@) 并重新运行 makemigrations/migrate 命令。
感谢您的帮助,但以防万一我想添加,我必须从文件夹中删除最后一个迁移文件,因为我仍然遇到这个问题,直到我在迁移第一个文件时删除文件解决问题的时间
@ruddra 这太棒了!!!非常感谢您的回答...它解决了我的问题!【参考方案2】:
我得到一个属性为唯一的字段,它不是唯一的[例如 2 次相同的值]
python3 manage.py migrate --fake
然后
python3 manage.py makemigrations
python3 manage.py migrate
这成功了
【讨论】:
【参考方案3】:这意味着 slug 应该是唯一的。您的模型中可能有一些数据。您需要删除该模型中的所有数据,并且需要再次迁移。
在这种情况下,您有两种方法可以修复错误;
您需要将其从Django admin
站点中删除。通常,当您尝试打开模型时,它可能会出错。
打开命令提示符
move to project -> py manage.py shell -> from yourappname.models import modelname -> modelname.objects.delete()
如果您为模型定义产品经理,请在此处。然后你必须定义一个删除函数。稍后你应该makemigrate
,migrate
并继续第二种方式
【讨论】:
【参考方案4】:对我有用的是在再次运行迁移之前转到管理员并更改重复 slug 的值。
【讨论】:
【参考方案5】:我刚刚遇到了这个类似的错误:Django UNIQUE 约束失败。我尝试检查代码很长时间,但没有解决。最后我用 SQLiteStudio 来检查数据,发现数据有问题:我无意中添加了两个违反 UNIQUE 约束的 SAME 实例。坦率地说,我没想到错误会如此幼稚和简单,因此我花了很多时间才发现!
【讨论】:
【参考方案6】:只需删除迁移文件夹中的最后一个迁移
然后运行
python manage.py makemigrations
python manage.py migrate
【讨论】:
【参考方案7】:我遇到了同样的问题,并通过使用唯一值填充我的 slugfied 管理员来解决,并且不将它们中的任何一个留空。
【讨论】:
【参考方案8】:基本上:您在一次操作中添加没有 unique=true 的字段,进行数据迁移,为您生成正确的 shortuuid,然后再次将字段更改为太唯一。
【讨论】:
以上是关于django.db.utils.IntegrityError:唯一约束失败:rango_category__new.slug的主要内容,如果未能解决你的问题,请参考以下文章