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 django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
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