web-dev-qa-db-fra.com

django.db.utils.IntegrityError: Échec de la contrainte UNIQUE: rango_category__new.slug

J'apprends Django de Tango avec Django mais je reçois toujours cette erreur quand je tape:

python manage.py makemigrations rango
python manage.py migrate

Voici la sortie:

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

La raison de cette contrainte pourrait être que vous n'aviez aucun champ appelé slug dans la classe Category lorsque vous l'avez initialement migré (première migration), et après avoir ajouté ce champ dans le modèle, lorsque vous avez exécuté makemigrations, vous avez défini la valeur par défaut sur une valeur statique (c'est-à-dire None ou '' etc.), et qui a rompu la contrainte unique pour la colonne slug de la table Category dans laquelle slug doit être unique mais ce n'est pas parce que toutes les entrées obtiendront cette valeur par défaut.

Pour résoudre ce problème, vous pouvez supprimer la base de données et les fichiers de migration et réexécuter makemigrations et migrate ou définir une valeur par défaut unique comme celle-ci:

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

Éditer:

Selon this , modifiez votre fichier de migration pour surmonter une contrainte unique. Par exemple, modifiez votre fichier de migration (qui a ajouté le champ slug au modèle) comme ceci:

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

J'ai obtenu un champ avec l'attribut unique, qui n'était pas unique [par exemple 2 fois la même valeur]

python3 manage.py migrate --fake

puis

python3 manage.py makemigrations

python3 manage.py migrate

cela a fait l'affaire

8
Nils Zenker

Cela signifie qu'un limace doit être unique. Vous pouvez avoir des données dans votre modèle. Vous devez supprimer toutes les données dans ce modèle et vous devez migrer à nouveau.

Dans cette situation, vous avez deux façons de corriger l'erreur;

  1. Vous devez le supprimer du Django admin site. Plus souvent qu'autrement, cela peut donner une erreur lorsque vous essayez d'ouvrir le modèle.

  2. Ouvrir l'invite de commande

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

Ici si vous définissez un chef de produit pour votre modèle. Ensuite, vous devez définir une fonction de suppression. Plus tard, vous devriez makemigrate, migrate et continuer avec la deuxième façon

1
Anvesh Shetty

Ce qui a fonctionné pour moi, c'était d'aller à l'admin et de changer la valeur de slug en double, avant de relancer les migrations.

0
sxmmie

Je viens de rencontrer cette erreur similaire: Django UNIQUE a échoué. J'ai essayé d'examiner le code pendant très longtemps, mais je ne l'ai pas résolu. J'ai finalement utilisé SQLiteStudio pour examiner les données, et j'ai trouvé les données problématiques: j'ai involontairement ajouté deux MÊMES instances qui violent la contrainte UNIQUE. Pour être franc, je n'ai pas pensé que l'erreur pouvait être aussi naïve et simple, et parce que il m'a fallu beaucoup de temps pour le découvrir!

0
Pistachio Guoguo