django: разрешения на миграцию данных

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

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

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

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

3 ответа

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

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

Есть 2 способа решить эту проблему:

1) Гадкий путь:

Бежать 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....

Вот шаги для добавления пользовательских разрешений к 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
Другие вопросы по тегам