我在Django中为权限创建了固定装置。我能够以他们需要的方式加载它们。但是,我的问题是......我想为表auth_group_permissions
加载一个灯具,我需要指定一个group_id
和一个permission_id
,不幸的是灯具并不是最好的处理这个问题的方法。是否有更简单的方法以编程方式执行此操作?这样我可以获得特定值的id
并将它们填入?这通常是怎么做的?
答案 0 :(得分:9)
正确的解决方案是以与框架本身相同的方式创建权限。
您应该在模块management.py
或management/__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