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
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)
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),
),
]
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
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;
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.
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
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.
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!