用于数据迁移的Django pytest数据库访问

编程入门 行业动态 更新时间:2024-10-23 22:32:30
本文介绍了用于数据迁移的Django pytest数据库访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在使用Django (1.9.6)、pytest (2.9.2)和pytest-django (2.9.1)

我有一个如下所示的数据迁移:

# -*- coding: utf-8 -*- # Generated by Django 1.9.6 on 2016-06-07 09:56 from __future__ import unicode_literals from django.db import migrations def create_groups(apps, schema_editor): Group = apps.get_model('auth', 'group') Permission = apps.get_model('auth', 'permission') group1 = Group.objects.create(name='grou1') group1_permissions = Permission.objects.filter(codename__in=[ 'add_app1_model', 'add_app2_model', 'custom_permission_app1_model' ]) group1.permissions.add(*list(group1_permissions)) group2 = Group.objects.create(name='group2') group2_permissions = Permission.objects.get( codename='custom_permission_app2_model' ) group2.permissions.add(*list(group2_permissions)) class Migration(migrations.Migration): dependencies = [ ('app1', '0001'), ('app2', '0001') ] operations = [ migrations.RunPython(create_groups) ] 当我执行py.test --create-db时,所有标记为pytest.mark.django_db的测试都在迁移的get操作中引发__fake__.DoesNotExist: Permission matching query does not exist.。

调试迁移时,我发现create操作可以工作,但是filter操作总是返回空的,我的测试数据库已经创建了组,但是没有权限关联到任何组。

我不知道我是不是做错了什么?我所做的临时修复是将get更改为filter,这使得迁移可以正常执行。在测试中,我有一个装置,它为用户分配所需的权限。因为我的所有代码都检查权限,而不是检查用户是否属于某个组。

我的所有测试都通过了。

推荐答案

我找到了解决方案,这要归功于@Haken Lid和他提供的Django issue。问题是Django创建ContentTypes,在所有迁移完成时接收发出的信号。这就是它找不到权限但允许我创建组的原因。

若要解决此问题,我们必须在数据迁移中手动发送信号。

# -*- coding: utf-8 -*- # Generated by Django 1.9.6 on 2016-06-07 09:56 from __future__ import unicode_literals from django.core.management.sql import emit_post_migrate_signal from django.db import migrations def create_groups(apps, schema_editor): # Send the signal to create the permissions db_alias = schema_editor.connection.alias try: # Django 1.9 emit_post_migrate_signal(2, False, db_alias) except TypeError: # Django < 1.9 try: # Django 1.8 emit_post_migrate_signal(2, False, 'default', db_alias) except TypeError: # Django < 1.8 emit_post_migrate_signal([], 2, False, 'default', db_alias) Group = apps.get_model('auth', 'group') Permission = apps.get_model('auth', 'permission') group1 = Group.objects.create(name='grou1') group1_permissions = Permission.objects.filter(codename__in=[ 'add_app1_model', 'add_app2_model', 'custom_permission_app1_model' ]) group1.permissions.add(*list(group1_permissions)) group2 = Group.objects.create(name='group2') group2_permissions = Permission.objects.get( codename='custom_permission_app2_model' ) group2.permissions.add(*list(group2_permissions)) class Migration(migrations.Migration): dependencies = [ ('app1', '0001'), ('app2', '0001'), ('contenttypes', '__latest__'), ('sites', '__latest__') ] operations = [ migrations.RunPython(create_groups) ]

在剪辑中,我们在访问权限之前发送信号,并且包括最新的contenttypes和sites应用迁移作为依赖项。

更多推荐

用于数据迁移的Django pytest数据库访问

本文发布于:2023-07-08 20:16:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1080285.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据库   数据   Django   pytest

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!