【问题标题】:how to populate database fields when model changes in django如何在 django 中更改模型时填充数据库字段
【发布时间】:2013-09-04 05:50:09
【问题描述】:
我有一个正在发展的 django 应用程序。模型经常改变,我使用 Django South 来应用模式迁移。
有时我的更改涉及填充基于 sql 逻辑添加的新值。
例如,为当前付费用户添加了一个新的布尔标志。我已经添加了该字段,应用了迁移,但现在我想根据其他表中的数据填充该字段以显示谁在付款。
我知道我可以用一个简单的 sql 语句来做到这一点,但我的环境是自动化的并且使用 CI。我想推送更改并自动填充标志。
我怎样才能做到这一点?与南?使用 Django?
【问题讨论】:
标签:
mysql
django
django-models
django-south
【解决方案1】:
有一个东西叫data migration,这是一个完美的用例:
数据迁移用于将存储在数据库中的数据更改为
匹配新的架构或功能。
from south.v2 import DataMigration
from django.conf import settings
class Migration(DataMigration):
def forwards(self, orm):
# update your user's boolean flag here
查看数据迁移示例here。
或者,您也可以打开架构迁移.py 文件并在forwards() 方法中填充您的字段,如下所示:
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding field 'User.paying'
db.add_column(u'user', 'paying',
self.gf('django.db.models.fields.BooleanField')(default=True),
keep_default=False)
# update your user's boolean flag here
def backwards(self, orm):
# Deleting field 'User.paying'
db.delete_column(u'user', 'paying')
【解决方案2】:
您可以在 south 创建的迁移脚本中添加您的代码。
如果您已更新模型并使用 south 完成 schemamigration,它将创建一个脚本来应用该迁移。它将位于appname/migration/00N_some_name.py。
架构更改完成后,您可以在该脚本最后的forwards() 方法中添加代码。