Как добавить разрешение пользователю/группе во время миграции django?

Я хотел бы выполнить следующую миграцию:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.auth.models import Permission
from django.db import migrations
from django.conf import settings
from django.contrib.auth.models import Group, User


def add_api_group(apps, schema_editor):

    Group.objects.create(name=settings.API_USER_GROUP)
    # get_or_create returns a tuple, not a Group
    group = Group.objects.get(name=settings.API_USER_GROUP)
    permissions = Permission.objects.filter(codename__in = [
        'add_topic',
    ])
    group.permissions.add(*permissions)


def add_api_user(apps, schema_editor):

    user = User.objects.create_user(username=settings.API_USER, password=settings.API_USER_PASSWORD)
    group = Group.objects.get(name=settings.API_USER_GROUP)
    user.groups.add(group)

class Migration(migrations.Migration):

    dependencies = [
        ('nd_content', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(add_api_group),
        migrations.RunPython(add_api_user)
    ]

В последней строке миграции я выдал ошибку, чтобы остановить выполнение и посмотреть состояние базы данных. Проблема в том, что таблица auth_permission по-прежнему не имеет разрешений модели другого модуля, хотя этот другой модуль зарегистрирован как зависимость этой миграции.

Я могу подтвердить, что отсутствующие разрешения добавляются только после выполнения всех миграций.


person Andras Gyomrey    schedule 08.08.2016    source источник


Ответы (3)


AttributeError: 'StateApps' object has no attribute 'label' in Django 1.10

Есть решение:

for app_config in apps.get_app_configs():
    app_config.models_module = True
    create_permissions(app_config, verbosity=0)
    app_config.models_module = None
person Anton Lisenkov    schedule 10.01.2017
comment
django.contrib.auth.management.create_permissions источник - person djvg; 23.03.2021

ИЗМЕНИТЬ 2018-01-31

Этот ответ будет работать только до Django 1.9. Для Django 1.10 и выше см. ответ, предоставленный @anton-lisenkov.

Исходный ответ (Django‹1.10)

Оказывается, я мог бы сделать следующее:

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

Спасибо @elad-silver за его ответ: https://stackoverflow.com/a/34272647/854868

person Andras Gyomrey    schedule 08.08.2016

Если вам не нужно прикреплять свое разрешение к личной модели, вы можете сделать это следующим образом:

from django.contrib.auth.models import Permission, ContentType


def add_permission(apps, schema_editor):
    content_type = ContentType.objects.get(app_label='auth', model='user')  # I chose user model but you can edit it
    permission = Permission(
        name='Your permission description',
        codename='your_codename',
        content_type=content_type,
    )
    permission.save()

person Jaume Jiménez    schedule 30.04.2019