Opened 3 years ago
Last modified 3 years ago
#34333 closed Bug
Django migrations adds constraint before adding field — at Version 2
| Reported by: | Raphael Beekmann | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 4.1 |
| Severity: | Normal | Keywords: | migration, constraint, field |
| Cc: | Durval Carvalho, David Wobrock | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hello,
I have a model, already created through previous migrations, and in a new migration I added a new field with an UniqueConstraint. The migrations script try to create the constraint first and then the new field, resulting an error :
django.core.exceptions.FieldDoesNotExist: NewModel has no field named 'category'
To reproduce the bug :
- Create a project with two models linked together with a One-to-Many relation and an unique constraint :
class Type(models.Model):
name = models.CharField(max_length=10)
class Model(models.Model):
name = models.CharField(max_length=10)
type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True)
date = models.DateField(auto_now=True)
class Meta:
constraints = (
models.UniqueConstraint(fields=('date', 'type'), name='unique_type_for_date'),
)
- Create a migration file with
manage.py makemigrations
- Add a new model with another One-to-Many relation and unique constraint. The models looks like this :
class Type(models.Model):
name = models.CharField(max_length=10)
class Category(models.Model):
name = models.CharField(max_length=10)
class Model(models.Model):
name = models.CharField(max_length=10)
type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
date = models.DateField(auto_now=True)
class Meta:
constraints = (
models.UniqueConstraint(fields=('date', 'type'), name='unique_type_for_date'),
models.UniqueConstraint(fields=('date', 'category'), name='unique_category_for_date'),
)
- Create a new migration file. The order of the migration's steps are incorrect and the migration crash :
class Migration(migrations.Migration):
dependencies = [
('app', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=10)),
],
),
migrations.AddConstraint(
model_name='model',
constraint=models.UniqueConstraint(fields=('date', 'category'), name='unique_category_for_date'),
),
migrations.AddField(
model_name='model',
name='category',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='app.category'),
),
]
Change History (2)
comment:1 by , 3 years ago
| Resolution: | → needsinfo |
|---|---|
| Status: | new → closed |
comment:2 by , 3 years ago
| Description: | modified (diff) |
|---|---|
| Resolution: | needsinfo |
| Status: | closed → new |
Note:
See TracTickets
for help on using tickets.
Thanks for the report, however I cannot reproduce this issue. For me,
makemigrationsgenerates operations in the correct order. Please reopen the ticket if you can debug your issue and provide a small project that reproduces it.