#34824 closed Cleanup/optimization (fixed)

Migrations generates two records when ForeignObject.to_fields/from_fields is not a tuple.

Reported by: puc_dong Owned by: puc_dong
Component: Migrations Version: 4.2
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 (last modified by puc_dong)

Our data platform involves many tables and uses a lot of ForeignObject fields. Many tables do not have foreign key associations. We found that if from_fields or to_fields is configured as an array type, without changing the table structure, if makemigrations is executed, a new migration record will be generated twice.

In the first generated migration file, from_fields and to_fields are both array types, and generate_altered_fields will type-convert the from_fields and to_fields values ​​under the current Model ForeignObject field into tuple types. Resulting in inconsistent comparisons and generating new migration file records

from_fields = getattr(new_field, "from_fields", None)
if from_fields:
    from_rename_key = (app_label, model_name)
    new_field.from_fields = tuple(
        [
            self.renamed_fields.get(
                from_rename_key + (from_field,), from_field
            )
            for from_field in from_fields
        ]
    )
    new_field.to_fields = tuple(
        [
            self.renamed_fields.get(rename_key + (to_field,), to_field)
            for to_field in new_field.to_fields
        ]
    )
...
if old_field_dec != new_field_dec and old_field_name == field_name:
    ...
    AlterField...

No error will be reported the third time, because the second makemigrations will be saved as tuple types into the migration file, which will be consistent with the next conversion.

operation record:

https://github.com/RelaxedDong/Images/assets/38744096/513e7021-bc2f-4f7e-aa51-188cdebceb00
https://github.com/RelaxedDong/Images/assets/38744096/3be6e3b9-ec0c-4fa8-9fd9-bd04082747c9
https://github.com/RelaxedDong/Images/assets/38744096/445fdd17-6c69-4e48-bb38-be9c11defe1b

I try to solve this problem:https://github.com/django/django/pull/17238

Change History (4)

comment:1 by puc_dong, 12 months ago

Description: modified (diff)

comment:2 by Mariusz Felisiak, 12 months ago

Component: Database layer (models, ORM)Migrations
Owner: changed from nobody to puc_dong
Status: newassigned
Summary: If to_fields or from_fields of ForeignObject is an array type, two migration records will be generated.Migrations generates two records when ForeignObject.to_fields/from_fields is not a tuple.
Triage Stage: UnreviewedAccepted

comment:3 by Mariusz Felisiak, 12 months ago

Triage Stage: AcceptedReady for checkin

comment:4 by Mariusz Felisiak <felisiak.mariusz@…>, 12 months ago

Resolution: fixed
Status: assignedclosed

In 9381700:

Fixed #34824 -- Prevented unnecessary AlterField when ForeignObject.from_fields/to_fields is not a tuple.

Note: See TracTickets for help on using tickets.
Back to Top