在编写测试用例时,我需要装备,或者我们可以说json数据来预先填充数据库.我有一个项目,这是使用Django组和权限模型.

现在,当我对转储数据使用命令python manage.py dumpdata auth.Groups > fixtures/groups.json时,它将转储groups.json文件中的所有数据,如下所示.

当一个特定的注册表被触发时,它将创建特定的组,并在该组中添加相关的相关权限,我已经在代码中定义了这一点.但如果已经创建了组,则不会try 再次创建它,只需将该组分配给用户即可.

enter image description here

在这里,根据其ID列出了权限.

Note:某些权限是默认权限,其他权限是模型中定义的自定义权限.

现在,我重新创建数据库.然后,迁移到python manage.py migrate并创建了一些用户,以便动态创建组,并将权限分配给我上面提到的组.然后,再次使用DUMP DATA命令,这次的ID是不同的.此外,当我在Django管理面板中验证组中的权限时,它显示分配给组的权限不同于I code的权限.

由此,我假设每当我重新创建数据库并调用Migrate命令时,它都会创建所有权限,但并不总是以相同的方式.因此,每次重新创建数据库时,单个权限对象可以具有不同ID.

我曾try 编辑groups.json文件以将ID更改为它们的代码名,但它显示的错误是列表必须包含int.

Question:我们有没有可能用权限代号来代替id,这样每个组都会有预期的权限,而不管他们的id是什么.另外,在加载数据时,特定的组只会根据他们的代号将权限分配给特定的组.这可能吗?

推荐答案

我找到了解决这here个问题的办法. 在这里,您可以看到自然 keys 的概念.(对于权限),您可以在Django的PermissionManager中找到由Django的默认django.contrib.auth.models提供的自然密钥

class PermissionManager(models.Manager):
   use_in_migrations = True
   def get_by_natural_key(self, codename, app_label, model):
       return self.get(
           codename=codename,
           content_type=ContentType.objects.db_manager(self.db).get_by_natural_key(
               app_label, model
           ),
       )

所以简单地说,你可以用dumpdata --natural-foreign代替dumpdata 获取数据权限的自然密钥,而不是ID.

Django相关问答推荐

在Django的反向函数中添加动态URL

Django测试:如何模拟Django_apps.get_Model()的LookupError

如何将Django项目连接到容器化的PostgreSQL数据库?

Urls.py中路径**kwargs的Django翻译?

如何将我的函数添加到值参数?

Django - 使用在 URL 中传递的父类主键从子类中过滤对象

Django授权判断具有通配符模式的URL

关于Django中批量保存对象的问题

django - 表单没有错误,但 form.is_valid() 没有验证

为 Django 模型生成非顺序 ID/PK

将现有 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?

Django Admin - 覆盖自定义表单字段的小部件

使用 XMLHttpRequest 提示下载文件

AngularJS + Django Rest Framework + CORS(CSRF Coo​​kie 没有出现在客户端)

Django模型字段按变量

Django - 每 x 秒运行一个函数

如何在 Django 中创建一个非空的 CharField?

Django - 保存新对象时如何获取 self.id?

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件

ImportError:没有名为 django_filters 的模块