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
Это означает, что пуля должна быть уникальной. У вас могут быть некоторые данные в вашей модели. Вам нужно удалить все данные в этой модели, и вам нужно перенести снова.
В этой ситуации у вас есть два способа исправить ошибку;
-
Вы должны удалить его с сайта Django admin
. Чаще всего это может привести к ошибке при попытке открыть модель.
-
Открыть командную строку
move to project -> py manage.py shell -> from yourappname.models import modelname -> modelname.objects.delete()
Здесь, если вы определяете менеджер продукта для вашей модели. Затем вы должны определить функцию удаления. Позже вам следует makemigrate
, migrate
и продолжить второй путь
Ответ 4
Для меня работало то, что я обратился к администратору и изменил значение дубликата слага, прежде чем снова запустить миграцию.
Ответ 5
python manage.py flush
Сделал трюк. Жестокий, но эффективный.
Предупреждение! Все ваши данные в базе данных будут потеряны. Вам нужно будет создать суперпользователя и так далее...