Initial data sql 不会为 South 管理的应用程序运行。据我了解,这是设计使然,尽管我找不到任何正式的证据,除了mailing list post。
要实现相同的行为,您可以创建迁移并将您的 SQL 转换到 Python。这就是我安装视图的方式:
创建和编辑迁移:
$ python manage.py schemamigration app1 install_foo_view --empty
$ vim app1/migrations/*_install_foo_view.py
这是迁移本身:
from south.db import db
from south.v2 import SchemaMigration
class Migration(SchemaMigration):
def forwards(self, orm):
db.execute("CREATE VIEW app1_foo AS SELECT col1, col2 FROM app1_bar")
def backwards(self, orm):
db.execute("DROP VIEW app1_foo")
# autogenerated models attibute goes here
complete_apps = ['app1']
对于数据迁移,流程类似:
$ python manage.py datamigration app1 install_bars
$ vim app1/migrations/*_install_bars.py
这是迁移本身:
from south.db import db
from south.v2 import DataMigration
class Migration(DataMigration):
def forwards(self, orm):
orm.Bar.objects.create(col1='val1', col2='val2')
def backwards(self, orm):
orm.Bar.objects.filter(col1='val1', col2='val2').delete()
# autogenerated models attibute goes here
complete_apps = ['app1']
数据夹具的official South doc 已损坏:
-
在架构更改方面不能很好地扩展。
您应该在每次更改 Bar 模型字段时复制和调整夹具文件。所以你最终会得到“my_fixture_v1.json”、“my_fixture_v2.json”等等。
否则,如果您不继续对它们进行版本控制而只保留最新版本,则以前版本的模型和夹具之间会出现不匹配,您将无法来回导航迁移。
- 不支持向后迁移。
建议的方法可以解决这两个问题:
- 由于您使用
orm.Bar,因此您拥有一组适用于Bar 的字段,就在历史的那个时刻。您不会得到任何缺失或额外的字段。
- 没有必要继续复制带有
Bar 更改的任何内容。
-
可以向后迁移。
请注意,使用filter().delete() 组合而不是get().delete()。这样您就不会删除已被用户更改的Bars,也不会在找不到Bar.DoesNotExist 时失败。