我正在为 Django 中的权限创建固定装置。我能够按照需要的方式加载它们。但是,我的问题是......假设我想为 table 加载一个夹具auth_group_permissions
,我需要指定 agroup_id
和 a permission_id
,不幸的是,夹具不是处理这个问题的最佳方法。有没有更简单的方法来以编程方式做到这一点?这样我就可以获得id
特定值并填写它们?这通常是如何完成的?
3 回答
至少从 Django >=1.7 开始,由于引入了“自然键”作为序列化选项,现在可以在夹具中存储权限。
您可以在Django 序列化文档中阅读有关自然键的更多信息
该文档明确提到自然键的用例是 when..
...对象是 Django 在数据库同步过程中自动创建的,给定关系的主键不容易预测;这将取决于执行迁移的方式和时间。这适用于所有自动生成对象的模型,特别是包括权限、组和用户。
因此,对于您的具体问题,关于auth_group_permissions
,您将使用以下语法转储您的夹具:
python manage.py dumpdata auth --natural-foreign --natural-primary -e auth.Permission
auth_permissions 表必须使用-e
标志明确排除,因为该表由migrate
命令填充,并且在加载固定装置之前已经具有数据。
然后,该夹具将以与任何其他夹具相同的方式加载
正确的解决方案是以与框架本身相同的方式创建权限。
您应该连接到模块中的内置post_migrate
信号或在management.py
那里management/__init__.py
创建权限。文档确实说响应post_migrate
信号执行的任何工作都不应该执行任何数据库模式更改,但您还应该注意框架本身会创建权限以响应此信号。
所以我建议你看一下应用程序的管理模块,django.contrib.auth
看看它应该如何完成。
只是添加到@jonpa 的评论中,如果您使用的是多租户应用程序并且您想直接将固定装置保存到文件中,您可以执行以下操作:
python manage.py tenant_command dumpdata --schema=<schema_name> --natural-foreign --natural-primary -e auth.Permission --indent 4 > /path/to/fixtures/fixtures.json