Opened 4 years ago
Closed 4 years ago
#33323 closed Bug (invalid)
On custom migrations, import of model classes with app.get_model('appname', 'ModelName') ignores overwritten models.Model methods
| Reported by: | Andreas Scheucher | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 3.2 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Given migration:
from django.db import migrations
from designs.models import Design
def fix_wrong_design_sheet_data(apps, schema_editor):
# do not import Model classes like in the line below. Overwritten methods are not executed.
# Design = apps.get_model('designs', 'Design')
for design in Design.objects.all().iterator():
if design. uuid in ['79f53b09-7069-480e-a8d9-d88ec0aad8d0', 'e26230cb-a9c7-4ee1-9523-0f2f70cf5c98']:
design.language = 'nt'
design.save(
force_insert=False,
force_update=True,
using='default',
update_fields=['id_slug', 'language'])
class Migration(migrations.Migration):
dependencies = [
('designs', '0027_related_design_cols_to_many_many_remove_old_col'),
]
operations = [
migrations.RunPython(fix_wrong_design_sheet_data),
]
Model class:
class Design(models_mixins.PkUUID, models_mixins.TrackingMixin):
niche = models.CharField(blank=False, null=True, max_length=50)
id = models.CharField(blank=False, null=True, max_length=4)
variant = models.CharField(blank=False, null=True, max_length=1)
language = models.CharField(max_length=2, default=None)
# this field is filled by the .save() method
id_slug = models.CharField(max_length=61, blank=False, null=True)
...
def save(self, force_insert: bool, force_update: bool, using: Optional[str], update_fields: Optional[Iterable[str]]) -> None:
print('new save')
int_id = int(self.id)
nslid = f'{self.niche}-{int_id:04}-{self.variant}--{self.language}'
self.id_slug = nslid
return super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
When imported with from designs.models import Design, then the Design.save method is called.
BUG:
Importing the Design model class with Design = apps.get_model('designs', 'Design') the Design.save method is not called.
Note:
See TracTickets
for help on using tickets.
As documented: