django.db.utils.IntegrityError:UNIQUE约束失败:rango_category__new.slug [英] django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
问题描述
python manage.py makemigrations rango
python manage.py migrate
这是输出:
django.db.utils.IntegrityError:UNIQUE约束失败:rango_category__new.slug
Models.py:
从django.db导入模型
从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。模型):
category = models.ForeignKey(Category)
title = models.CharField(max_length = 128)
url = models.URLField()
views = models.IntegerField默认= 0)
def __unicode __(self):
return self.title
这个约束的原因可能是您在<$ c $中没有任何名为 slug
的字段当您初次迁移它(第一次迁移),并且在模型中添加此字段之后,当您运行 makemigrations
时,您可以使用c>类别将默认值设置为静态值(即 None
或等),并且破坏了类别表的slug列的唯一约束,其中slug应该是唯一的,但是不是因为所有的条目都将获得该默认值。
要解决这个问题,您可以删除数据库和迁移文件,并重新运行 makemigrations
和迁移
或设置一个唯一的默认值,如下所示:
slug = models.SlugField(unique = default = uuid.uuid1)
编辑:
根据这个,修改您的迁移文件以克服独特的约束。例如,修改您的迁移文件(其中添加了slug字段到模型中),如下所示:
import uuid
来自app.models import类别#where app == tango_app_name
class Migration(migrations.Migration):
依赖关系= [
('yourproject','0003_remove_category_slug ')
$ b def gen_uuid(apps,schema_editor):
在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 = uui d.uuid4,unique = True),
),
]
I learning Django from Tango with Django and I keep getting this error when I type:
python manage.py makemigrations rango
python manage.py migrate
This is the output:
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
The reason for this constrain could be that you didn't have any field called slug
in Category
class when you have initially migrated it(First Migration), and after adding this field in the model, when you ran makemigrations
, you have set default value to something static value(i.e None
or '' etc), and which broke the unique constrain for the Category's table's slug column in which slug should be unique but it isn't because all the entry will get that default value.
To solve this, you can either drop the database and migration files and re-run makemigrations
and migrate
or set a unique default value like this:
slug = models.SlugField(unique=True, default=uuid.uuid1)
Edit:
According to this, modify your migration file to overcome unique constrain. For example, modify your migration file(which added the slug field to the model) like this:
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),
),
]
这篇关于django.db.utils.IntegrityError:UNIQUE约束失败:rango_category__new.slug的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!