Search code examples
djangodjango-south

(Django) Everytime I migrate with South, I get an error about fixtures/initial_data.json


I current have a file under fixtures/initial_data.json that instantiate data in the model. I know there is no problem with the json because everything goes smoothly the first time I run ./manage syncdb.

After I converted the app to use South, every time I run ./manage migrate doors I get this traceback:

Running migrations for doors:
 - Migrating forwards to 0002_auto__del_field_userprofile_status.
 > doors:0002_auto__del_field_userprofile_status
 - Loading initial data for doors.
Problem installing fixture '/Users/hobbes3/Sites/mysite/doors/fixtures/initial_data.json': Traceback (most recent call last):
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/core/management/commands/loaddata.py", line 174, in handle
    obj.save(using=using)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/models/base.py", line 526, in save_base
    rows = manager.using(using).filter(pk=pk_val)._update(values)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/models/query.py", line 491, in _update
    return query.get_compiler(self.db).execute_sql(None)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 869, in execute_sql
    cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/Users/hobbes3/.virtualenvs/doors/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
IntegrityError: null value in column "created" violates not-null constraint

Right now I just ignore the errors, since the migration still says it was successful:

(doors)hobbes3@hobbes3 ~/Sites/mysite $ python manage.py migrate doors --list

 doors
  (*) 0001_initial
  (*) 0002_auto__del_field_userprofile_status

I'm not sure if South is trying to reload the JSON without truncating the table first (and there is a primary key conflict?). But the error sounds like South is trying to insert data with the created field set to NULL. I don't know why it would be trying to do that.

I'm not sure if this is helpful, but here is my initial_data.json

[
    {
        "model" : "doors.usertype",
        "pk" : 1,
        "fields" : {
          "name" : "tenant"
        }
    },
    {
        "model" : "doors.usertype",
        "pk" : 2,
        "fields" : {
          "name" : "property manager"
        }
    },
    {
        "model" : "doors.usertype",
        "pk" : 3,
        "fields" : {
          "name" : "property owner"
        }
    },
        {
        "model" : "doors.usertype",
        "pk" : 4,
        "fields" : {
          "name" : "vendor"
        }
    },
    {
        "model" : "doors.usertype",
        "pk" : 5,
        "fields" : {
          "name" : "web user"
        }
    },
    {
        "model" : "doors.doorsgroup",
        "pk" : 1,
        "fields" : {
            "name"                : "Moderator",
            "comment"             : "Moderators can create, edit, and delete all orders. They can also modify users, vendors, and places. They can comment on any orders and delete comments. They can view and manage all users.",
            "view_all_users"      : true,
            "manage_all_users"    : true,
            "view_all_orders"     : true,
            "create_orders"       : true,
            "edit_all_orders"     : true,
            "manage_orders"       : true,
            "delete_orders"       : true,
            "create_comments"     : true,
            "create_any_comments" : true,
            "delete_comments"     : true,
            "view_vendors"        : true,
            "modify_vendors"      : true,
            "view_places"         : true,
            "modify_places"       : true
        }
    },
    {
        "model" : "doors.doorsgroup",
        "pk" : 2,
        "fields" : {
            "name"            : "Manager",
            "comment"         : "Managers can view, edit, and delete all orders. They can also approve, reject, or close orders. They can view all users.",
            "view_all_users"  : true,
            "view_all_orders" : true,
            "create_orders"   : true,
            "edit_all_orders" : true,
            "manage_orders"   : true,
            "delete_orders"   : true,
            "create_comments" : true,
            "view_vendors"    : true,
            "view_places"     : true
        }
    },
    {
        "model" : "doors.doorsgroup",
        "pk" : 3,
        "fields" : {
            "name"            : "Tenant",
            "comment"         : "Tenants can create orders, comment on their orders, and view vendors and places.",
            "create_orders"   : true,
            "create_comments" : true,
            "view_vendors"    : true,
            "view_places"     : true
        }
    },
    {
        "model" : "doors.doorsgroup",
        "pk" : 4,
        "fields" : {
            "name"            : "Vendor",
            "comment"         : "Vendors can only comment on the orders that are assigned to them.",
            "create_comments" : true
        }
    },
    {
        "model" : "doors.doorsgroup",
        "pk" : 5,
        "fields" : {
            "name"            : "Observer",
            "comment"         : "Observers can view all users, orders, vendors, and places.",
            "view_all_users"  : true,
            "view_all_orders" : true,
            "view_vendors"    : true,
            "view_places"     : true
        }
    }
]

And part of my models.py

class DoorsGroup( models.Model ) :
    def __unicode__( self ) :
        return self.name

    name    = models.CharField( max_length = 135 )
    comment = models.TextField( blank = True )

    # Permissions.
    view_all_users   = models.BooleanField()
    manage_all_users = models.BooleanField() # Assign to places or to vendors.

    view_all_orders = models.BooleanField()
    create_orders   = models.BooleanField()
    edit_all_orders = models.BooleanField()
    manage_orders   = models.BooleanField() # Can approve, reject, and close orders.
    delete_orders   = models.BooleanField()

    create_comments     = models.BooleanField()
    create_any_comments = models.BooleanField() # Can comment on any orders.
    delete_comments     = models.BooleanField()

    view_vendors   = models.BooleanField()
    modify_vendors = models.BooleanField() # Can create, edit, and delete vendors.

    view_places   = models.BooleanField()
    modify_places = models.BooleanField()

    created  = models.DateTimeField( auto_now_add = True )
    modified = models.DateTimeField( auto_now = True )

class UserType( models.Model ) :
    def __unicode__( self ) :
        return self.name

    name     = models.CharField( max_length = 135 )
    created  = models.DateTimeField( auto_now_add = True )
    modified = models.DateTimeField( auto_now = True )

Solution

  • South always try to insert found fixtures after migration. For your case, the error was caused by the schema-incompatibility of the probably out-of-date json fixture and new DB state after migration. Its OK to skip the insertion of fixtures by

    ./manage.py migrate doors --no-initial-data
    

    Or fix the fixture manually.