2016-06-08 90 views
1

我使用Django (1.9.6)pytest (2.9.2)pytest-django (2.9.1)Django的pytest數據遷移

數據庫訪問我有一個數據遷移,看起來像這樣:

# -*- 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正在籌集__fake__.DoesNotExist: Permission matching query does not exist.get的遷移操作。

調試遷移我發現create操作正常,但filter操作總是返回空白,我的測試數據庫創建了組,但沒有權限與任何組關聯。

我不知道我是否做錯了什麼?我所做的臨時修復是將get更改爲filter,這使遷移正常執行。在測試中,我有一個固定裝置可以爲用戶分配所需的權限。因爲我所有的代碼都是根據權限進行檢查的,而不是如果用戶屬於一個組,我所有的測試都會通過。

+0

在這個django問題跟蹤器討論中,如何解決這個問題有一些建議。 https://code.djangoproject.com/ticket/23422 –

回答

0

由於@HåkenLid和他提供的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) 
    ] 

在剪斷我們訪問權限之前發送的信號,我們有最新的contenttypessites應用程序遷移的依賴關係。