web-dev-qa-db-ja.com

django.db.utils.IntegrityError:UNIQUE制約が失敗しました: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
15
ArrowsX

この制約の理由は、最初に移行したときに(最初の移行)、モデルにこのフィールドを追加した後、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),
        ),
    ]
15
ruddra

一意ではない属性を持つフィールドを取得しました(例:2回同じ値)

python3 manage.py migrate --fake

その後

python3 manage.py makemigrations

python3 manage.py migrate

これはトリックをしました

8
Nils Zenker

これは、スラッグが一意であることを意味します。モデルにデータが含まれている可能性があります。そのモデルではすべてのデータを削除する必要があり、もう一度移行するする必要があります。

この状況では、エラーを修正する方法が2つあります。

  1. Django adminサイトから削除する必要があります。多くの場合、モデルを開こうとするとエラーが発生することがあります。

  2. コマンドプロンプトを開く

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

ここで、モデルの製品マネージャーを定義します。次に、削除関数を定義する必要があります。後でmakemigratemigrateして、2番目の方法を続行する必要があります

1
Anvesh Shetty

私にとってうまくいったのは、移行を再度実行する前に、管理者に行き、重複スラッグの値を変更することでした。

0
sxmmie

Django= UNIQUE制約が失敗しました。非常に長い間コードを調べてみましたが、解決できませんでした。SQLiteStudioを使用して最終的にデータを調べます、そしてデータに問題があることがわかりました:誤って追加しましたNIQUE制約に違反する2つのSAMEインスタンス。率直に言うと、この単純で単純なエラーは考えられませんでした。調べるのにかなりの時間がかかりました!

0