2016-07-20 4 views
2

Nach this post zu sehen, versuche ich meine eigene Gruppe am Projekt-Setup mit dieser Migration zu erstellen:Schaffung programmatisch eine Gruppe: Kann nicht Zugriffsberechtigungen von Migration

from django.db import migrations 
from django.contrib.auth.models import Group, Permission 

def create_group(apps, schema_editor): 
    group, created = Group.objects.get_or_create(name='thing_managers') 
    if created: 
     add_thing = Permission.objects.get(codename='add_thing') 
     group.permissions.add(add_thing) 
     group.save() 

class Migration(migrations.Migration): 

    dependencies = [ 
     ('main', '0002_auto_20160720_1809'), 
    ] 

    operations = [ 
     migrations.RunPython(create_group), 
    ] 

Aber ich habe folgende Fehlermeldung:

django.contrib.auth.models.DoesNotExist: Permission matching query does not exist. 

Hier ist mein Modell:

class Thing(models.Model): 
    pass 

Warum kann ich das tun? Wie könnte ich das lösen?

Ich benutze django 1.9.

+0

Zuerst sollten Sie Ihre Modelle nicht importieren von 'from django.contrib.auth.models import Group, Permission', aber mit' apps.get_model ("some_app", "model_name") '. Und 2. der Fehler ist ziemlich klar - Sie haben keine Erlaubnis mit 'codename = 'add_thing'' – Todor

Antwort

1

Berechtigungen werden in einem post_migrate Signal erstellt. Sie existieren nicht, wenn Migrationen zum ersten Mal ausgeführt werden, nachdem ein neues Modell hinzugefügt wurde. Es ist wahrscheinlich am einfachsten die post_migratesignal handler manuell auszuführen:

from django.contrib.auth.management import create_permissions 

def create_group(apps, schema_editor): 
    for app_config in apps.get_app_configs(): 
     create_permissions(app_config, apps=apps, verbosity=0) 

    group, created = Group.objects.get_or_create(name='thing_managers') 
    if created: 
     add_thing = Permission.objects.get(codename='add_thing') 
     group.permissions.add(add_thing) 
     group.save() 

create_permissions Kontrollen für bestehende Berechtigungen, so dass dies keine Duplikate nicht erstellen.

+0

Aber in diesem Fall, wie war die Antwort auf einen anderen Beitrag, den ich verlinkt sollte funktionieren? Vielleicht hat sich der Erstellungsprozess für Berechtigungen seit 1.7 geändert? Ich habe versucht, Ihre Lösung, aber ich habe immer noch den gleichen Fehler. – vmonteco

+0

Für welches Modell sind die Berechtigungen, die Sie abrufen möchten? Wird das Modell in einer früheren Migration in derselben App erstellt? Andernfalls müssen Sie [Abhängigkeit hinzufügen] (https://docs.djangoproject.com/en/1.9/topics/migrations/#accessing-models-from-other-apps) der App hinzufügen, in der das Modell definiert ist. – knbk

+0

Für das 'Thing' Modell in meiner' main' App. Das Modell wird in der Datei models.py erstellt. Ich habe zuvor keine Migrationen berührt. – vmonteco

Verwandte Themen