#24303: Not all models available in custom data migration
----------------------------+-----------------------------
Reporter: grandfatha | Owner: nobody
Type: Bug | Status: new
Component: Migrations | Version: 1.7
Severity: Normal | Keywords: data migrations
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
----------------------------+-----------------------------
I am building an EAV driven database. I need to write a complex data
migration, which shall move the values an actual model field onto an
attribute/value model instance. The code cannot be disclosed, but a
simplified version looks like this:
app: actions
{{{
class Action(models.Models):
name = models.CharField(...)
values = generic.GenericRelation(Value, content_type_field="owner_ct",
object_id_field="owner_id")
items = models.ManyToManyField(Item, ...)
}}}
app: attributes
{{{
class Attribute(models.Model):
name = models.CharField(...)
....
class Value(models.Model)
value = models.CharField (...)
attribute = models.ForeignKe(Attribute, ...)
owner_id = models.PositiveIntegerField(blank=True, null=True)
owner_ct = models.ForeignKey(ContentType, ....)
owner = generic.GenericForeignKey(ct_field='owner_ct',
fk_field='owner_id')
}}}
app: items
{{{
class Item(MPTTModel):
user_label = models.CharField(...)
}}}
Basically the goal is to create an Attribute for the field "user_label" of
class Item and migrate all user_label values onto a Value instance that
are connected to the Item through the Action model.
When I try to create a data migration for this, only some of the models
are loaded in the app registry, depending on where I put the data
migration. When I try to load them using "get_model" only parts of all my
models within my app are loaded..
{{{
def forwards(apps, schema_editor):
Value = apps.get_model('attributes','Value')
Attribute = apps.get_model('attributes','Attribute')
Action = apps.get_model('actions','Action')
Item = apps.get_model('items','Item')
.....
class Migration(migrations.Migration):
dependencies = [
(....'),
]
operations = [
migrations.RunPython(code=forwards)
]
}}}
I cannot run the database access code, because the instances returned by
get_model are missing
My current workaround:
Create a management command that runs the code necessary to fulfill the
desired side-effects of the data migration. This works, because I have
full access to all of my models.
The downside of this approach is that you have to remember when to run the
management command. I cannot create a schema migration right now to remove
the soon to be unused "user_label" charfield, because I need to run the
management command in between the migrations manually.
Am I doing something wrong? How can I create a data migration that has
access to all models just like management commands do?
--
Ticket URL: <https://code.djangoproject.com/ticket/24303>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/053.2f03e15d0848e341748142f7378a4eaf%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.