mysqldjangodjango-syncdb

Django update models.py when database changes


I know this might be a sill question but I've been half an hour trying to figure this out and couldn't find anything :S

I have a django app and I significantly changed my database tables. I want to update my models.py file, but I tried the following commands and nothing happens.

syncdb, migrate, makemigrations...

I want to delete my previous models file and create a new one.

Thank you!


Solution

  • You got the workflow the wrong way around.

    Django has an ORM that manages your database. If you want to make a change, you edit your models.py file. The migrations will automatically alter the database table to match your new model. It doesn't work the other way around: Django does not use database introspection to pick up manual changes in the database and edit your models file.

    Now, there is a workaround, but it's not a long-term solution. In time you'll want to add custom functionality to your models, and you don't want to rewrite that functionality after each change. The introspection Django provides isn't perfect either, it's only meant as a tool to quickly start developing your application on top of a legacy database.

    You can use manage.py inspectdb to generate the Django code for all existing tables. You can then copy the code for your specific model over to your models.py file. You should then delete the managed = False and db_table = ... options, remove any migrations, double-check the fields, and rerun makemigrations and migrate --fake-initial. This will get the database, your models, and your migrations back in sync, and then you'll be able to use the migrations framework for any additional changes.

    Be sure to read the docs on migrations. That should leave you with a good understanding of how Django manages the database, and what the workflow is to make changes to your database.