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

Python 用于数据迁移的Django pytest数据库访问,python,django,pytest,pytest-django,Python,Django,Pytest,Pytest Django,我正在使用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_edito

我正在使用
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\u db
的测试都会引发
\uuuu fake\uuuuuuu\uuuu异常。DoesNotExist:权限匹配查询不存在。
在迁移的
get
操作中

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


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

多亏了@Håken Lid和他提供的帮助,我找到了解决方案。问题是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)
    ]
#-*-编码:utf-8-*-
#由Django 1.9.6于2016-06-07 09:56生成
从未来导入unicode文字
从django.core.management.sql导入发出\u post\u migrate\u信号
从django.db导入迁移
def创建组(应用程序、架构编辑器):
#发送创建权限的信号
db_alias=schema_editor.connection.alias
尝试:
#Django 1.9
发出后迁移信号(2,False,db\u别名)
除类型错误外:
#Django<1.9
尝试:
#Django 1.8
发出后迁移信号(2,False,“default”,db\u别名)
除类型错误外:#Django<1.8
发出后迁移信号([],2,False,“default”,db\u别名)
Group=apps.get_model('auth','Group'))
权限=应用程序。获取模型('auth','Permission'))
group1=Group.objects.create(name='grou1')
group1\u permissions=Permission.objects.filter(在=[
“添加应用1模型”,
“添加应用程序2模型”,
'自定义权限\应用程序1 \模型'
])
group1.permissions.add(*列表(group1\u权限))
group2=Group.objects.create(name='group2')
group2\u permissions=Permission.objects.get(
codename='custom\u permission\u app2\u model'
)
group2.permissions.add(*列表(group2_权限))
类迁移(migrations.Migration):
依赖项=[
('app1','0001'),
('app2','0001'),
('contenttypes','uuuuuu-latest'uuuuuuuuuu'),
(“站点”、“最新站点”)
]
操作=[
RunPython(创建组)
]

在snipped中,我们在访问权限之前发送信号,并将最新的
内容类型
站点
应用程序迁移作为依赖项。

多亏了@Håken Lid和他提供的解决方案,我找到了解决方案。问题是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)
    ]
#-*-编码:utf-8-*-
#由Django 1.9.6于2016-06-07 09:56生成
从未来导入unicode文字
从django.core.management.sql导入发出\u post\u migrate\u信号
从django.db导入迁移
def创建组(应用程序、架构编辑器):
#发送创建权限的信号
db_alias=schema_editor.connection.alias
尝试:
#Django 1.9
发出后迁移信号(2,False,db\u别名)
除类型错误外:
#Django<1.9
尝试:
#Django 1.8
发出后迁移信号(2,False,“default”,db\u别名)
除类型错误外:#Django<1.8
发出后迁移信号([],2,False,“default”,db\u别名)
Group=apps.get_model('auth','Group'))
权限=应用程序。获取模型('auth','Permission'))
group1=Group.objects.create(name='grou1')
group1\u permissions=Permission.objects.filter(在=[
“添加应用1模型”,
“添加应用程序2模型”,
'自定义权限\应用程序1 \模型'
])
group1.permissions.add(*列表(group1\u权限))
group2=Group.objects.create(name='group2')
group2\u permissions=Permission.objects.get(
codename='custom\u permission\u app2\u model'
)
group2.permissions.add(*列表(group2_权限))
类迁移(migrations.Migration):
依赖项=[
('app1','0001'),
('app2','0001'),
('contenttypes','uuuuuu-latest'uuuuuuuuuu'),
(“站点”、“最新站点”)
]
操作=[
RunPython(创建组)
]

在snipped中,我们在访问权限之前发送信号,并将最新的
内容类型
站点
应用程序迁移作为依赖项。在django问题跟踪讨论中,有一些关于如何解决此问题的建议。在这个django问题跟踪讨论中,有一些关于如何解决这个问题的建议。