Issue
In django, by default, if you have a structure like this
app
├── migrations
└── models
└ example
The generated name of your model will be app_example
when executing the command makemigrations
.
My problem is that I want to move my model from the directory app to the directory other_app which has the same structure.
other_app
├── migrations
└── models
-> example will go here
At the same time, I want the generated name of my model to be other_app_example
once I migrate without having to delete my table, as to avoid losing the data in it. The thing is, when you create a migration in django after changing a model of place, django delete the model in the migration directory of app
and recreate it in another migration in other_app
.
I know that I have to create a custom migration, but how can I achieve what I want to do ? All I found was RenameModel, but it doesn't change the name generated by django.
Solution
I found a solution, it may not be the best one but it works !
Simply create an empty migration in other_app
with the command python manage.py makemigrations --empty other_app
.
In it, I added a runSql query where I renamed the table from app_example to other_app_example, like this :
migrations.RunSQL(
"ALTER TABLE app_example RENAME TO other_app_example;"
),
Before migrating, I just moved my example
model to the model directory of other_app
, then proceeded to do a python manage.py migrate
and it worked fine !
The only downside to this method is that I did not manage to use other methods than raw sql with RunSQL, like RenameField or AlterField did not work for me. I then had to add every changes I wanted to do in raw sql.
Then, to fake the migrations generated by django that delete and create my model, as I couldn't use migrate --fake, I decided to set the managed parameter of my model to be set to false.
Answered By - Lirit
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.