﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
24303	Not all models available in custom data migration	Daniel Kimmig	nobody	"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?
"	Bug	closed	Migrations	1.7	Normal	worksforme	data migrations		Unreviewed	0	0	0	0	0	0
