Opened 21 months ago
Closed 21 months ago
#34366 closed Cleanup/optimization (fixed)
Migration optimizer does not reduce multiple AlterField
Reported by: | Laurent Tramoy | Owned by: | Laurent Tramoy |
---|---|---|---|
Component: | Migrations | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | 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
Let's consider the following operations:
operations = [ migrations.AddField( model_name="book", name="title", field=models.CharField(max_length=256, null=True), ), migrations.AlterField( model_name="book", name="title", field=models.CharField(max_length=128, null=True), ), migrations.AlterField( model_name="book", name="title", field=models.CharField(max_length=128, null=True, help_text="help"), ), migrations.AlterField( model_name="book", name="title", field=models.CharField(max_length=128, null=True, help_text="help", default=None), ), ]
If I run the optimizer, I get only the AddField
, as we could expect. However, if the AddField
model is separated from the AlterField (e.g. because of a non-elidable migration, or inside a non-squashed migration), none of the AlterField
are reduced:
optimizer.optimize(operations[1:], "books") [<AlterField model_name='book', name='title', field=<django.db.models.fields.CharField>>, <AlterField model_name='book', name='title', field=<django.db.models.fields.CharField>>, <AlterField model_name='book', name='title', field=<django.db.models.fields.CharField>>]
Indeed, the AlterField.reduce
does not consider the the case where operation
is also an AlterField
.
Is this behaviour intended? If so, could it be documented?
Otherwise, would it make sense to add something like
if isinstance(operation, AlterField) and self.is_same_field_operation( operation ): return [operation]
Change History (5)
comment:1 by , 21 months ago
Triage Stage: | Unreviewed → Accepted |
---|---|
Type: | Uncategorized → Cleanup/optimization |
Version: | 4.1 → dev |
comment:4 by , 21 months ago
Triage Stage: | Accepted → Ready for checkin |
---|
Your analysis is correct Laurent, the reduction of multiple
AlterField
against the same model is simply not implemented today hence why you're running this behaviour.Given you're already half way there I would encourage you to submit a PR that adds these changes and an optimizer regression test to cover them if you'd like to see this issue fixed in future versions of Django.