Django.db.utils.IntegrityError: УНИКАЛЬНОЕ ограничение не выполнено: 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

Ответ 1

Причиной этого ограничения может быть то, что у вас не было поля с именем slug в классе Category, когда вы перенесли его сначала (первая миграция), и после добавления этого поля в модель, когда вы запускали makemigrations, вы задали значение по умолчанию для чего-то статического значения (т.е. None или 'и т.д.) и который нарушил уникальный ограничитель для столбца столбцов таблицы Category, в котором slug должен быть уникальным, но это не потому, что все запись получит это значение по умолчанию.

Чтобы решить эту проблему, вы можете удалить файлы базы данных и миграции и повторно запустить makemigrations и migrate или установить уникальное значение по умолчанию, подобное этому:

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

Edit:

В соответствии с 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),
        ),
    ]

Ответ 2

Я получил поле с уникальным атрибутом, который не был уникальным [например, 2-х разное значение]

python3 manage.py migrate --fake

затем

python3 manage.py makemigrations

python3 manage.py migrate

это сделал трюк

Ответ 3

Это означает, что пуля должна быть уникальной. У вас могут быть некоторые данные в вашей модели. Вам нужно удалить все данные в этой модели, и вам нужно перенести снова.

В этой ситуации у вас есть два способа исправить ошибку;

  1. Вы должны удалить его с сайта Django admin. Чаще всего это может привести к ошибке при попытке открыть модель.

  2. Открыть командную строку

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

Здесь, если вы определяете менеджер продукта для вашей модели. Затем вы должны определить функцию удаления. Позже вам следует makemigrate, migrate и продолжить второй путь

Ответ 4

Для меня работало то, что я обратился к администратору и изменил значение дубликата слага, прежде чем снова запустить миграцию.

Ответ 5

python manage.py flush 

Сделал трюк. Жестокий, но эффективный. Предупреждение! Все ваши данные в базе данных будут потеряны. Вам нужно будет создать суперпользователя и так далее...