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

时间:2015-03-31 16:38:37

标签: django 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

9 个答案:

答案 0 :(得分:14)

这种约束的原因可能是,当您最初迁移它(第一次迁移)时,以及在模型中添加此字段后,您在slug类中没有任何名为Category的字段,当你运行makemigrations时,你已经将默认值设置为静态值(即None或'等),这打破了类别表的slug列的唯一约束,其中slug应该是唯一的但并不是因为所有条目都会获得该默认值。

要解决此问题,您可以删除数据库和迁移文件,然后重新运行makemigrationsmigrate,或者设置一个唯一的默认值,如下所示:

slug = models.SlugField(unique=True, default=uuid.uuid1)

编辑:

根据this,修改您的迁移文件以克服唯一约束。例如,修改您的迁移文件(将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),
        ),
    ]

答案 1 :(得分:5)

我得到了一个属性唯一的字段,它不是唯一的[例如2次相同值]

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/public;
    index index.php;

    location / {
            try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }
}

然后

python3 manage.py migrate --fake

这就是诀窍

答案 2 :(得分:1)

这意味着a应该是唯一的。您的模型中可能有一些数据。您需要删除该模型中的所有数据,并且需要再次迁移。

在这种情况下有两种方法

  1. 您需要将其从django admin网站中删除。尝试打开模型时,所有这些都可能会导致错误。

  2. 打开命令提示符

move to project -> py manage.py shell -> from yourappname.models import modelname -> modelname.objects.delete()

在此是否为模型定义产品经理。然后,您必须定义一个删除功能。稍后,您应该makemigrate,进行迁移并继续第二种方式

答案 3 :(得分:0)

对我有用的是在再次运行迁移之前,请管理员并更改重复段塞的值。

答案 4 :(得分:0)

我刚刚遇到了类似的错误:Django UNIQUE约束失败。我尝试检查代码很长时间,但没有解决。我最终使用SQLiteStudio 检查数据,发现数据有问题:我无意中添加了两个违反UNIQUE约束的SAME实例。坦率地说,我没想到错误可能是这么天真和简单,因此花了很多时间才找出来!

答案 5 :(得分:0)

只需删除迁移文件夹中的最后一个迁移

然后运行

python manage.py makemigrations 
python manage.py migrate

答案 6 :(得分:0)

我遇到了同样的问题,并通过使用唯一值填充我的 slugfied 来解决管理员,而不将其中任何一个留空。

答案 7 :(得分:0)

基本上:您在一次操作中添加没有 unique=true 的字段,进行数据迁移,为您生成正确的 shortuuid,然后再次将字段更改为太唯一。

答案 8 :(得分:-4)

python manage.py flush 

诀窍。残酷但有效。 警告!数据库中的所有数据都将丢失。你必须创建超级用户等等......