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