我使用Django从Tango学习Django,当我输入时我不断收到此错误:
python manage.py makemigrations rango
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)
这是输出:
django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
rud*_*dra 17
这种约束的原因可能是您在最初迁移它时没有slug
在Category
类中调用任何字段(第一次迁移),并且在模型中添加此字段后,在运行时makemigrations
,您已将默认值设置为静态值价值(即None
或"等"),它破坏了类别表格的slug列的唯一约束,其中slug应该是唯一的但不是因为所有条目都将获得该默认值.
要解决此问题,您可以删除数据库和迁移文件并重新运行makemigrations
和/ migrate
或设置一个唯一的默认值,如下所示:
slug = models.SlugField(unique=True, default=uuid.uuid1)
Run Code Online (Sandbox Code Playgroud)
根据此,修改您的迁移文件以克服唯一约束.例如,修改您的迁移文件(将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),
),
]
Run Code Online (Sandbox Code Playgroud)
我有一个具有唯一属性的字段,该属性不是唯一的(例如2次相同的值)
python3 manage.py migrate --fake
Run Code Online (Sandbox Code Playgroud)
然后
python3 manage.py makemigrations
python3 manage.py migrate
Run Code Online (Sandbox Code Playgroud)
这成功了
归档时间: |
|
查看次数: |
24921 次 |
最近记录: |