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
この制約の理由は、最初に移行したときに(最初の移行)、モデルにこのフィールドを追加した後、slug
クラスにCategory
というフィールドがなかったことが原因である可能性があります。 makemigrations
を実行したとき、デフォルト値を静的な値(つまりNone
または ''など)に設定しており、これにより、slugが存在するべきカテゴリのテーブルのslug列に対する一意の制約が破られました。一意ですが、すべてのエントリがそのデフォルト値を取得するため、そうではありません。
これを解決するには、データベースと移行ファイルを削除してmakemigrations
とmigrate
を再実行するか、次のように一意のデフォルト値を設定します。
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),
),
]
一意ではない属性を持つフィールドを取得しました(例:2回同じ値)
python3 manage.py migrate --fake
その後
python3 manage.py makemigrations
python3 manage.py migrate
これはトリックをしました
これは、スラッグが一意であることを意味します。モデルにデータが含まれている可能性があります。そのモデルではすべてのデータを削除する必要があり、もう一度移行するする必要があります。
この状況では、エラーを修正する方法が2つあります。
Django admin
サイトから削除する必要があります。多くの場合、モデルを開こうとするとエラーが発生することがあります。
コマンドプロンプトを開く
move to project -> py manage.py Shell -> from yourappname.models import modelname -> modelname.objects.delete()
ここで、モデルの製品マネージャーを定義します。次に、削除関数を定義する必要があります。後でmakemigrate
、migrate
して、2番目の方法を続行する必要があります
私にとってうまくいったのは、移行を再度実行する前に、管理者に行き、重複スラッグの値を変更することでした。
Django= UNIQUE制約が失敗しました。非常に長い間コードを調べてみましたが、解決できませんでした。SQLiteStudioを使用して最終的にデータを調べます、そしてデータに問題があることがわかりました:誤って追加しましたNIQUE制約に違反する2つのSAMEインスタンス。率直に言うと、この単純で単純なエラーは考えられませんでした。調べるのにかなりの時間がかかりました!