I use south to migrate my django models. There is however a nasty bug in south. It doesn't set default values in Postgres Databases. Example:
created_at = models.DateTimeField(default = datetime.now)
tag_id = models.PositiveIntegerField(default = 0)
South will add these 2 fields to database, but fail to set their default values, which needs to be done manually.
Is there any patch for this bug?
UPDATE
I had already tried setting default date with auto_now_add=True
, but that is also not setting defaults. Adding null=True
in field adds a db.alter_column
in migration script produced by south. But that only removes NOT NULL
constraint, doesnt add a default. Same for integer field
If you are auto-generating your migrations using:
./manage.py schemamigration app_name --auto
Then you need to make a small edit to the migration before you actually apply it. Go into the generated migration (should be called something like app_name/migrations/000X__auto_add_field_foo.py
) and look for the argument:
keep_default=False
in the db.add_column
call. Simply change this to:
keep_default=True
And Django will now apply your default value to the actual schema, in addition to any existing rows. Would be great if South had some kind of setting to generate this parameter as True
by default, but no such luck. You will need to make this edit every time.