django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
我正在使用 Django 从 Tango 学习 Django,但我在键入时一直收到此错误:
python manage.py makemigrations rango
python manage.py migrate
这是输出:
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
Models.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
此限制的原因可能是您在 Category
class 中没有任何名为 slug
的字段,当您最初迁移它时(第一次迁移),以及之后在模型中添加此字段,当您 运行 makemigrations
时,您已将默认值设置为静态值(即 None
或 ''
等),这打破了唯一性限制类别的 table 的 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),
),
]
我得到一个具有唯一属性的字段,它不是唯一的[例如 2 次相同的值]
python3 manage.py migrate --fake
然后
python3 manage.py makemigrations
python3 manage.py migrate
这成功了
这意味着 slug 应该是独一无二的。您的模型中可能有一些数据。您需要删除该模型中的所有数据,并且您需要再次迁移。
在这种情况下,您有两种方法可以修复错误;
您需要将其从 Django admin
站点中删除。通常情况下,当您尝试打开模型时,它可能会出错。
打开命令提示符
move to project -> py manage.py shell -> from yourappname.models import modelname -> modelname.objects.delete()
这里如果你为你的模型定义一个产品经理。然后你必须定义一个删除函数。稍后你应该 makemigrate
, migrate
并继续第二种方式
对我有用的是在 运行 再次迁移之前,去管理员那里更改 duplicate slug 的值。
我刚遇到类似的错误:Django UNIQUE 约束失败。我试了很长时间检查代码,但没有解决。我终于用 SQLiteStudio 检查数据,发现数据有问题:我无意中添加了 两个违反 UNIQUE 约束的 SAME 实例。坦率地说,我没想到错误会如此幼稚和简单,因此我花了很多时间才发现!
只需删除迁移文件夹中的最后一个迁移
然后运行
python manage.py makemigrations
python manage.py migrate
我遇到了同样的问题并通过使用唯一值填充我的 slugfied 管理员解决了,并且没有将任何值留空。
基本上:您在一个操作中添加没有 unique=true 的字段,进行数据迁移为您生成正确的 shortuuids,然后再次将字段更改为太独特。
我遇到了同样的问题并尝试了所有建议的答案。最终对我有用的是,在我将 slug 字段定义为模型中的 URL 和 运行 makemigrations 之后。我在 makemigrations 中编辑了文件,在基本的 URL 末尾添加了一个 运行dom 编号,像这样
由 Django 3.2.3 于 2022-02-02 生成20:58
从 django.db 导入迁移、模型
从 运行dom 导入 运行dint
class迁移(migrations.Migration):
dependencies = [
('blog', '0002_remove_post_slug1'),
]
operations = [
migrations.AddField(
model_name='post',
name='slug',
field=models.URLField(blank=True, default='http:/salpimientapa.com/' + str(randint(100000,999999))),
),
]
我运行之后
python manage.py 迁移
我将 slug 编辑为 SlugModel 并 运行 makemigrations 并再次迁移
我正在使用 Django 从 Tango 学习 Django,但我在键入时一直收到此错误:
python manage.py makemigrations rango
python manage.py migrate
这是输出:
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
Models.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
此限制的原因可能是您在 Category
class 中没有任何名为 slug
的字段,当您最初迁移它时(第一次迁移),以及之后在模型中添加此字段,当您 运行 makemigrations
时,您已将默认值设置为静态值(即 None
或 ''
等),这打破了唯一性限制类别的 table 的 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),
),
]
我得到一个具有唯一属性的字段,它不是唯一的[例如 2 次相同的值]
python3 manage.py migrate --fake
然后
python3 manage.py makemigrations
python3 manage.py migrate
这成功了
这意味着 slug 应该是独一无二的。您的模型中可能有一些数据。您需要删除该模型中的所有数据,并且您需要再次迁移。
在这种情况下,您有两种方法可以修复错误;
您需要将其从
Django admin
站点中删除。通常情况下,当您尝试打开模型时,它可能会出错。打开命令提示符
move to project -> py manage.py shell -> from yourappname.models import modelname -> modelname.objects.delete()
这里如果你为你的模型定义一个产品经理。然后你必须定义一个删除函数。稍后你应该 makemigrate
, migrate
并继续第二种方式
对我有用的是在 运行 再次迁移之前,去管理员那里更改 duplicate slug 的值。
我刚遇到类似的错误:Django UNIQUE 约束失败。我试了很长时间检查代码,但没有解决。我终于用 SQLiteStudio 检查数据,发现数据有问题:我无意中添加了 两个违反 UNIQUE 约束的 SAME 实例。坦率地说,我没想到错误会如此幼稚和简单,因此我花了很多时间才发现!
只需删除迁移文件夹中的最后一个迁移
然后运行
python manage.py makemigrations
python manage.py migrate
我遇到了同样的问题并通过使用唯一值填充我的 slugfied 管理员解决了,并且没有将任何值留空。
基本上:您在一个操作中添加没有 unique=true 的字段,进行数据迁移为您生成正确的 shortuuids,然后再次将字段更改为太独特。
我遇到了同样的问题并尝试了所有建议的答案。最终对我有用的是,在我将 slug 字段定义为模型中的 URL 和 运行 makemigrations 之后。我在 makemigrations 中编辑了文件,在基本的 URL 末尾添加了一个 运行dom 编号,像这样
由 Django 3.2.3 于 2022-02-02 生成20:58
从 django.db 导入迁移、模型 从 运行dom 导入 运行dint
class迁移(migrations.Migration):
dependencies = [
('blog', '0002_remove_post_slug1'),
]
operations = [
migrations.AddField(
model_name='post',
name='slug',
field=models.URLField(blank=True, default='http:/salpimientapa.com/' + str(randint(100000,999999))),
),
]
我运行之后 python manage.py 迁移
我将 slug 编辑为 SlugModel 并 运行 makemigrations 并再次迁移