Django固定权限

时间:2012-07-04 19:56:16

标签: django fixtures

我在Django中为权限创建了固定装置。我能够以他们需要的方式加载它们。但是,我的问题是......我想为表auth_group_permissions加载一个灯具,我需要指定一个group_id和一个permission_id,不幸的是灯具并不是最好的处理这个问题的方法。是否有更简单的方法以编程方式执行此操作?这样我可以获得特定值的id并将它们填入?这通常是怎么做的?

3 个答案:

答案 0 :(得分:9)

正确的解决方案是以与框架本身相同的方式创建权限。

您应该在模块management.pymanagement/__init__.py中连接到内置post_migrate信号,并在那里创建权限。文档确实说,响应post_migrate信号而执行的任何工作都不应执行任何数据库模式更改,但您还应注意框架本身会创建响应此信号的权限。

所以我建议您查看django.contrib.auth应用程序的management module,了解它应该如何完成。

答案 1 :(得分:9)

至少Django> = 1.7,由于引入了"自然键"现在可以在灯具中存储权限。作为序列化选项。

您可以在Django serialization documentation

中详细了解自然键

文档明确提到自然键的用例是......

  

... Django在数据库同步过程中自动创建对象,给定关系的主键不容易预测;它将取决于执行迁移的方式和时间。对于自动生成对象的所有模型都是如此,特别是包括权限,组和用户。

因此,对于您的具体问题,关于auth_group_permissions,您将使用以下语法转储您的灯具:

python manage.py dumpdata auth --natural-foreign --natural-primary -e auth.Permission

必须使用-e标志明确排除auth_permissions表,因为该表由migrate命令填充,并且在加载灯具之前已经有数据。

然后将以与任何其他灯具相同的方式加载此灯具

答案 2 :(得分:0)

只需添加到@jonpa的注释中,如果您使用的是多租户应用程序,并且您想要将灯具直接保存到文件中,则可以执行以下操作:

python manage.py tenant_command dumpdata --schema=<schema_name> --natural-foreign --natural-primary -e auth.Permission --indent 4 > /path/to/fixtures/fixtures.json