django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug

前端 未结 7 2391
渐次进展
渐次进展 2020-12-01 05:47

I\'m learning Django from Tango with Django but I keep getting this error when I type:

python manage.py makemigrations rango
python manage.py migrate
         


        
相关标签:
7条回答
  • 2020-12-01 06:13

    I just met this simiilar error: Django UNIQUE constraint failed. I tried examine the code for very long time, but didn't solve it. I finally used SQLiteStudio to examine the data, and found the data is problematic: I unintentionally added two SAME instances which violates the UNIQUE constraint. To be frank I haven't thought the error could be this naive and simple, and because so it took me a lot of time to find out!

    0 讨论(0)
  • 2020-12-01 06:19

    This means a slug should be unique. You may have some data in your model. You need to delete all the data in that model and you need to migrate again.

    In this situation, you have two ways to fix the error;

    1. You need to delete it from the Django admin site. More often than not, it may give an error when you are trying to open the model.

    2. Open command prompt

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

    Here if you define a product manager for your model. Then you have to define a delete function. Later you should makemigrate, migrate and continue with the second way

    0 讨论(0)
  • 2020-12-01 06:20

    The reason for this constrain could be that you didn't have any field called slug in Category class when you have initially migrated it (First Migration), and after adding this field in the model, when you ran makemigrations, you have set default value to something static value(i.e None or '' etc), and which broke the unique constrain for the Category's table's slug column in which slug should be unique but it isn't because all the entry will get that default value.

    To solve this, you can either drop the database and migration files and re-run makemigrations and migrate or set a unique default value like this:

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

    Edit:

    According to Migrations that add unique fields, modify your migration file to overcome unique constrain. For example, modify your migration file (which added the slug field to the model) like 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),
            ),
        ]
    
    0 讨论(0)
  • 2020-12-01 06:20

    I got a field with attribute unique, which was not unique [eg 2-time same value]

    python3 manage.py migrate --fake
    

    then

    python3 manage.py makemigrations
    
    python3 manage.py migrate
    

    this did the trick

    0 讨论(0)
  • 2020-12-01 06:22

    Just delete the last migration in the migration folder

    Then run

    python manage.py makemigrations 
    python manage.py migrate
    
    0 讨论(0)
  • 2020-12-01 06:29

    What worked for me was going to the admin and changing the value of duplicate slug, before running the migrations again.

    0 讨论(0)
提交回复
热议问题