How to add a new field to a model with new Django migrations?

pedro_witoi picture pedro_witoi · Jun 19, 2014 · Viewed 56k times · Source

I'm using the contribute_to_class method but I don't know how to create the field in the database with new migrations.

Answer

Nima picture Nima · Aug 12, 2014

To answer your question, with the new migration introduced in Django 1.7, in order to add a new field to a model you can simply add that field to your model and initialize migrations with ./manage.py makemigrations and then run ./manage.py migrate and the new field will be added to your DB.

To avoid dealing with errors for your existing models however, you can use the --fake:

  1. Initialize migrations for your existing models:

    ./manage.py makemigrations myapp
    
  2. Fake migrations for existing models:

    ./manage.py migrate --fake myapp
    
  3. Add the new field to myapp.models:

    from django.db import models
    
    class MyModel(models.Model):
        ... #existing fields
        newfield = models.CharField(max_length=100) #new field
    
  4. Run makemigrations again (this will add a new migration file in migrations folder that add the newfield to db):

    ./manage.py makemigrations myapp
    
  5. Run migrate again:

    ./manage.py migrate myapp