如何在 django 中更改模型时填充数据库字段

Posted

技术标签:

【中文标题】如何在 django 中更改模型时填充数据库字段【英文标题】:how to populate database fields when model changes in django 【发布时间】:2013-09-04 05:50:09 【问题描述】:

我有一个正在发展的 django 应用程序。模型经常改变,我使用 Django South 来应用模式迁移。

有时我的更改涉及填充基于 sql 逻辑添加的新值。

例如,为当前付费用户添加了一个新的布尔标志。我已经添加了该字段,应用了迁移,但现在我想根据其他表中的数据填充该字段以显示谁在付款。

我知道我可以用一个简单的 sql 语句来做到这一点,但我的环境是自动化的并且使用 CI。我想推送更改并自动填充标志。

我怎样才能做到这一点?与南?使用 Django?

【问题讨论】:

【参考方案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() 方法中添加代码。

【讨论】:

以上是关于如何在 django 中更改模型时填充数据库字段的主要内容,如果未能解决你的问题,请参考以下文章

Django:保存模型时填充用户 ID

如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?

在 Django 模型中填充现有字段

Django Rest Framework:POST时自动填充模型的字段?

如何在 Django REST 框架中更改字段名称

允许使用 django-profiles 更改用户字段(如电子邮件)