47π
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),
),
]
21π
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
- [Django]-Inject errors into already validated form?
- [Django]-ImportError: No module named django.core.wsgi Apache + VirtualEnv + AWS + WSGI
- [Django]-Django: is there a way to count SQL queries from an unit test?
3π
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;
-
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. -
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
- [Django]-Request.user returns a SimpleLazyObject, how do I "wake" it?
- [Django]-What is the equivalent of django.db.models.loading.get_model() in Django 1.9?
- [Django]-How do I make many-to-many field optional in Django?
1π
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!
- [Django]-How to set up a Django project in PyCharm
- [Django]-How do I get Django Admin to delete files when I remove an object from the database/model?
- [Django]-Celery unable to use redis
1π
I had the same problem and tried all the suggested answers. What finally worked for me was, after I defined the slug field as a URL in models, and ran the makemigrations. I edited the file in makemigrations adding a random number at the end of a basic URL, like this
Generated by Django 3.2.3 on 2022-02-02 20:58
from django.db import migrations, models
from random import randint
class Migration(migrations.Migration):
dependencies = [
('blog', '0002_remove_post_slug1'),
]
operations = [
migrations.AddField(
model_name='post',
name='slug',
field=models.URLField(blank=True, default='http:/salpimientapa.com/' + str(randint(100000,999999))),
),
]
After I ran
python manage.py migrate
I edit the slug as a SlugModel and ran the makemigrations and migrate again
- [Django]-Django Admin Form for Many to many relationship
- [Django]-What's the purpose of Django setting βSECRET_KEYβ?
- [Django]-Django serve static index.html with view at '/' url
0π
What worked for me was going to the admin and changing the value of duplicate slug, before running the migrations again.
- [Django]-Parsing unicode input using python json.loads
- [Django]-Django: how does manytomanyfield with through appear in admin?
- [Django]-Filter Queryset on empty ImageField
0π
Just delete the last migration in the migration folder
Then run
python manage.py makemigrations
python manage.py migrate
- [Django]-Pip install -r requirements.txt [Errno 2] No such file or directory: 'requirements.txt'
- [Django]-Django storages: Import Error β no module named storages
- [Django]-How to use schemas in Django?
0π
I faced the same issue and solved by populating my slugfied throβ the admin with unique values and without leaving any of them blank.
- [Django]-How to write django test meant to fail?
- [Django]-How to get URL of current page, including parameters, in a template?
- [Django]-How to get getting base_url in django template
0π
Basically: You add the field without unique=true in one operation, make a data migration that generates the correct shortuuids for you, and then change the field too unique again.
- [Django]-Change Django Templates Based on User-Agent
- [Django]-How to query directly the table created by Django for a ManyToMany relation?
- [Django]-Allowing only super user login
0π
i have this error too ,
i did delete my database in djangoProject ( for example db.sqlite3 )
and then run
python manage.py makemigrations
python manage.py migrate
- [Django]-Django: change the value of a field for all objects in a queryset
- [Django]-Remove leading and trailing slash / in python
- [Django]-Alowing 'fuzzy' translations in django pages?
0π
Itβs an Integrity Error probably because the migration will temper with the already exiting data in the database.
I had this error and hereβs what I did:
-
Enter in the project folder directory
-
Open the python interpreter
py manage.py shell
- Import your Models
from yourappname.models import model
- Delete existing data records in the model
model.objects.all().delete()
- Exit the Python Interpreter
exit()
.
Another thing you could do is to set unique="false"
on the affecting field. I think this should work; not so sure.
- [Django]-Model name of objects in django templates
- [Django]-Django ManyToMany model validation
- [Django]-Django: dependencies reference nonexistent parent node
0π
Deleting migration is not always the best way! In the event, you wish to maintain your db and want to add unique filed to an existing table. Here is a step to bypass the error and still maintain your db records.
- Run makemigrations
- Edited the migration file and removed unique=True (0039_alter_course_options_rename_created_course_timestamp_and_more).
eg:
Before
migrations.AddField(
model_name='content',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, unique=True),
),
After
migrations.AddField(
model_name='content',
name='uuid',
field=models.UUIDField(default=uuid.uuid4),
),
- Now if you migrate, it should run fine. Next, you need to update all previous records.
Create a custom managements
courses/
βββ __init__.py
βββ management/
β βββ __init__.py
β βββ commands/
β βββ __init__.py
β βββ check_uuid_uniqueness.py
βββ models.py
βββ ...
βββ ...
Mine looks like so in the check_uuid_uniqueness.py
from django.apps import apps
from django.core.management.base import BaseCommand
import uuid
class Command(BaseCommand):
help = 'Check the uniqueness of uuid fields in models and generate unique values if necessary.'
def handle(self, *args, **options):
app_name = 'courses'
models = apps.get_app_config(app_name).get_models()
for model in models:
if hasattr(model, 'uuid'):
instances = model.objects.all()
for instance in instances:
list_item = instances.filter(uuid=instance.uuid)
if not instance.uuid or len(list_item)>1:
instance.uuid = uuid.uuid4()
instance.save()
print(model, ' updated: ', instance.uuid)
self.stdout.write(self.style.SUCCESS('UUID uniqueness check completed.'))
Remember, in my case, I was targeting uuid
, yours could be slug
.
- Finally, run the custom command (make sure your python venv is activated)
python manage.py check_uuid_uniqueness
- [Django]-In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?
- [Django]-How to apply multiple filters on a Django template variable?
- [Django]-Django rest framework β filtering for serializer field
0π
python manage.py dbshell
>> DROP TABLE rango_category__new.slug;
delete associated migration file;
python manage.py makemigration
python manage.py migrate
- [Django]-Django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17))
- [Django]-Any thoughts on A/B testing in Django based project?
- [Django]-What's the best way to handle Django's objects.get?