Hi gang,

I'm trying to refactor the apps in my project, and I can't figure out any 
clean way to migrate models with their data from one app to another. I'm 
really looking for answers to two questions:

1. Is there any canonical way to do this?

2. I've moved my models to the new app but I have them using the tables 
from the old app using Meta.db_table. How do I make migrations understand 
what's going on and not try to delete my old tables? Once migrations gets 
what's going on, how do I rename the old table so it fits the new app name 
so I no longer need Meta.db_table?

--

For question 1. I'm really surprised there isn't a good way to do this. I 
mean—this is kind of a blatant use case for a migration—moving a model from 
one app to another.

My initial thought was to use a use a three phase migration. Create new 
models, copy data over, delete old models. But I'd really rather not 'cause 
the models are all very interconnected and that seems like a recipe for a 
foreign key disaster.

What I actually went with was to move all the models over to the new app, 
and then point them at the old tables using Meta.db_table. Everything 
works, but when I run makemigrations it is confused as crap and wants to 
destroy everything, which brings me to question 2...

---

So question 2, now that I have my model code in a new app pointing at the 
old tables, how do I get the tables renamed to use canonical table names 
and let migrations know wtf is going on?

With the current situation, if I run makemigrations it does something like 
this

Migrations for 'new_app':
  0001_initial.py:
    - Create model Building
    ...
    - Add field contact to building
    ...
Migrations for 'old_app':
  0006_auto_delete_blah.py:
    - Remove field contact from building
    ...
    - Delete model Building

    ...


all of which is roughly correct, just doesn't keep my data intact. :P

My gameplan (*please *correct me if any of this is wrong) is to:

1. Fake the ('new_app', '0001_initial') migration.
2. Make a new data migration depending on ('new_app', '0001_initial') and 
the ('old_app', '0005_...') that uses AlterModelTable 
<https://docs.djangoproject.com/en/1.7/ref/migration-operations/#altermodeltable>
 to 
rename the tables to their canonical names as would normally be created by 
the 0001_initial migration.
3. Fake the ('old_app', '0006_auto_delete_blah')migration.
4. Get rid of the Meta.db_table entries so my moved models just use the 
normal table names they're supposed to.

Seems like it should get me to where I want to go.


Am I smoking crack? Is this really that hard?


Thanks!
Andy.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" 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].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/63151710-6cde-429b-9af7-09de397704cd%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to