2

我正在用 Django 编写一个应用程序,它有一些我需要实例化的站点范围的固定对象,由于某种原因,它们不能是固定装置。

例如,某些(例如Permissions)我不能硬编码 PK,因为我不能确定它们是否会按特定顺序加载(如果我使用 pk=null,那么如果它们已经存在,我会得到一个 IntegrityError .)

其他(例如Sites)取决于 中的值settings.py编辑:这些需要在每次部署项目时运行,否则我可以按照下面 super9 的建议使用 South 的数据迁移。

由于这些是 Django 模型,因此它们与我项目中的任何应用程序都没有直接关系。加载它们最有意义,settings.py但这会导致循环导入。它可以正常工作,urls.py但是将加载代码放在那里似乎很笨拙且不合时宜。

我研究了将接收器挂钩post_syncdb如下:

@receiver(post_syncdb)
def create_groups_and_permissions(sender, **kwargs):
    print "Creating groups and permissions"
    u_ct = ContentType.objects.get(model="user")
    Group.objects.get_or_create(name='Group 1')
    Permission.objects.get_or_create(name="Perm 1", codename="perm_1", content_type=u_ct)

但是,由于我使用的是 South,因此根据文档,它仅post_syncdb在首次创建表时发送。syncdb每次迁移后我都可以手动调用,但不希望这样做。

我几乎决定将它们放入urls.py或最密切相关的应用程序中models.py,但我想我会在这里检查一下是否有一种可接受的方式来加载无法作为固定装置加载的固定对象。

4

1 回答 1

1

你检查过南方的数据迁移了吗?http://south.aeracode.org/docs/tutorial/part3.html

听起来这可能是你需要的。

于 2012-05-10T02:08:37.407 回答