#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.

Reply via email to