架构迁移和默认值

时间:2013-04-17 20:43:05

标签: python django django-south

我正在使用South来管理我的数据库。似乎每当我改变模型创建方式时,我最终都需要为迁移做一堆体操。例如,假设我有一个这样的类:

class Entry(models.Model):

    title = models.CharField(max_length=80)
    author = models.ForeignKey(User)
    pubDate = models.DateTimeField()
    tags = models.ManyToManyField(Tag)
    text = models.TextField()

另一个将Entry作为ForeignKey的类:

class Comment(models.Model):
    author = models.ForeignKey(User)
    entry = models.ForeignKey(Entry)
    pubDate = models.DateTimeField()
    text = models.TextField()

这很简单,但是如果我要做一些简单的事情,比如在Entry中将名称pubDate更改为pub_date,为了正确执行模式迁移只是为了更改名称,我必须设置:< / p>

default=None, null=True

对于Entry中的pubDate和entry中的Comment字段,否则在尝试运行迁移时会出现以下异常:

The field 'Comment.entry' does not have a default specified, yet is NOT NULL.

然后我必须返回并取出默认值/ null值。是否有一种不那么繁琐的方法来做到这一点,或者我是否必须在将它们提交给迁移之前真正考虑我的模型?在开始阶段,如果您没有任何您关心的数据,那么设置和拆除数据库会更有意义吗?如果是这样,最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

您需要创建一个迁移类,使用:

python manage.py datamigration yourapp change_name_to_pub_date

并重写前后方法:

# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):
    def forwards(self, orm):
        db.rename_column('yourapp_entry', 'pubDate', 'pub_date')
        db.rename_column('yourapp_comment', 'pubDate', 'pub_date')

    def backwards(self, orm):
        db.rename_column('yourapp_entry', 'pub_date', 'pubDate')
        db.rename_column('yourapp_comment', 'pub_date', 'pubDate')

现在,运行:

python manage.py migrate yourapp