2

Ich mag die folgende Migration auszuführen:Wie kann einem Benutzer/einer Gruppe während einer Django-Migration eine Berechtigung hinzugefügt werden?

# -*- 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) 
    ] 

In der letzten Zeile der Migration gab ich einen Fehler Ausführung zu stoppen und den Datenbank-Status zu sehen. Das Problem ist, die Tabelle auth_permission hat immer noch nicht die Berechtigungen eines Modells eines anderen Moduls, obwohl dieses andere Modul als eine Abhängigkeit dieser Migration registriert ist.

Ich kann bestätigen, fehlende Berechtigungen scheinen nur hinzugefügt werden, nachdem alle Migrationen ausgeführt wurden.

Antwort

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

i Es s eine Lösung:

for app_config in apps.get_app_configs(): 
    app_config.models_module = True 
    create_permissions(app_config, verbosity=0) 
    app_config.models_module = None 
3

EDIT 2018-01-31

Diese Antwort wird nur bis Django 1.9 arbeiten. Für Django 1.10 eine nach oben, finden Sie in der answer von @ anton-Lisenkov bereitgestellt

Original-Antwort (Django < 1,10)

Es stellt sich heraus, dass ich folgendes tun könnte:

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 

Thanks @ Elad-Silber für seine Antwort: https://stackoverflow.com/a/34272647/854868