django.db.utils.IntegrityError:UNIQUE约束失败:rango_category__new.slug

Arr*_*wsX 12 django slug

我使用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

这种约束的原因可能是您在最初迁移它时没有slugCategory类中调用任何字段(第一次迁移),并且在模型中添加此字段后,在运行时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)


Nil*_*ker 9

我有一个具有唯一属性的字段,该属性不是唯一的(例如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)

这成功了