2015-03-27 5 views
3

У меня есть набор новых разрешений, которые мне нужно перенести. Я попытался сделать это через миграцию данных, но жалуется на ContentType not being available.django: разрешения переноса данных

Выполнение быстрых исследований Я узнал, что таблица ContentType заполнена после всех миграций.

Я даже пробовал использовать update_all_contenttypes() от from django.contrib.contenttypes.management import update_all_contenttypes , что приводит к миграции для загрузки данных, которые не соответствуют устройству.

Каков наилучший способ переноса данных разрешения в Django?

+0

Можете ли вы вставить свои модели и выполнить миграцию? – Udi

+0

У меня такая же проблема. Миграция выглядит следующим образом: http://pastebin.com/avmfXHmY; 'INSTALLED_APPS = ('svsite', ..., 'django.contrib.contenttypes', '...', 'member')' и пользователь просто расширяет 'AbstractUser'. – Mark

+0

Кажется, что ничего не получится. Все экземпляры 'Permission' 'ContentType', которые не существуют во время миграции ... – Mark

ответ

2

Вот шаги для добавления пользовательских разрешений на User модели:

Сначала нужно создать файл переноса, например, при приложении аутентификации,

Здесь я назвал его 0002_permission_fixtures.py:

account (your authentication application) 
|_migrations 
    |__ 0001_initial.py 
    |__ 0002_permission_fixtures.py 
    |__ __init__.py 

Затем добавьте свои объекты разрешения, а именно:

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from django.db import migrations 


def forwards_func(apps, schema_editor): 
    # Get models that we needs them 
    user = apps.get_model("auth", "User") 
    permission = apps.get_model("auth", "Permission") 
    content_type = apps.get_model("contenttypes", "ContentType") 
    # Get user content type object 
    uct = content_type.objects.get_for_model(user) 
    db_alias = schema_editor.connection.alias 
    # Adding your custom permissions to User model: 
    permission.objects.using(db_alias).bulk_create([ 
     permission(codename='add_sample', name='Can add sample', content_type=uct), 
     permission(codename='change_sample', name='Can change sample', content_type=uct), 
     permission(codename='delete_sample', name='Can delete sample', content_type=uct), 
    ]) 


class Migration(migrations.Migration): 
    dependencies = [ 
    ('contenttypes', '__latest__'), 
      ] 

    operations = [ 
     migrations.RunPython(
      forwards_func, 
     ), 
    ] 

Чтобы выполнить эту миграцию, сначала перенесите модель contenttype, а затем перенесите приложение (вот учетная запись).

$ python manage.py migrate contenttypes 
$ python manage.py migrate account 
+0

Не было бы лучше использовать тип контента« Пример »в отличие от типа содержимого пользователя? – pawciobiel

6

Есть 2 способа решения этого:

1) Отвратительный путь:

Run manage.py migrate auth перед вашей разыскиваемой миграцией

2) Рекомендуемый способом:

from django.contrib.auth.management import create_permissions 

def add_permissions(apps, schema_editor): 
    apps.models_module = True 

    create_permissions(apps, verbosity=0) 
    apps.models_module = None 

    # rest of code here.... 
1

Вот быстрый и грязный способ обеспечить все разрешения для всех приложений ha было создано:

def add_all_permissions(): 
    from django.apps import apps 
    from django.contrib.auth.management import create_permissions 

    for app_config in apps.get_app_configs(): 
     app_config.models_module = True 
     create_permissions(app_config, verbosity=0) 
     app_config.models_module = None 
Смежные вопросы