2017-10-16 71 views
0

我儘量按照這個教程「Programmatically creating a group : Can't access permissions from migration」,我的代碼是:如何自動在Django創建組1.11.2

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.2 on 2017-10-16 13:48 
from __future__ import unicode_literals 

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


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

    # Criando Administrador 
    group, created = Group.objects.get_or_create(name='Administrador') 
    if created: 
     add_thing = Permission.objects.get(
         codename=['can_add_permision', 
              'can_change_permission', 
              'can_add_user', 
              'can_change_user', 
              'can_add_video', 
              'can_change_video', 
              'can_delete_video', 
              'can_add_documents', 
              'can_change_documents', 
              'can_delete_documents', 
              'can_add_news', 
              'can_change_news', 
              'can_delete_news', 
              'can_add_basics', 
              'can_change_basics', 
              'can_add_board', 
              'can_change_board', 
              'can_delete_board', 
              'can_add_history', 
              'can_change_history', 
              'can_delete_history', 
              'can_add_shortcuts', 
              'can_change_shortcuts', 
              'can_delete_shortcuts',] 
     ) 
     group.permissions.add(add_thing) 
     group.save() 
     logger.info('Grupo Administrador Criado') 

class Migration(migrations.Migration): 

    dependencies = [ 
    ] 

    operations = [ 
     migrations.RunPython(add_group_permissions), 
    ] 

而且我的錯誤是:

self.model._meta.object_name django.contrib.auth.models.DoesNotExist: Permission matching query does not exist. 

是它可能是問題與dependencies相關?或者我該怎麼做?

[UPDATE 1]

後@Trilliput的提示組創建空的。

enter image description here

[更新2]

我去掉前綴can_,之後使用@Trilliput的技巧,利用殼python manage.py shell

from django.contrib.auth.models import Permission 
permissions_qs = Permission.objects.filter(codename__in=['add_permission', 'change_permission', 'add_user', 'change_user', 'add_video', 'change_video', 'delete_video', 'add_documents', 'change_documents', 'delete_documents', 'add_news', 'change_news', 'delete_news', 'add_basics', 'change_basics', 'add_board', 'change_board', 'delete_board', 'add_history', 'change_history', 'delete_history', 'add_shortcuts', 'change_shortcuts', 'delete_shortcuts',]) 
permissions_qs.count() 
>>> 24 

我保存的文件0001.initial.py和運行python manage.py migrate但沒有做過。

我如何被迫再次跑步?

[更新3]

完整的代碼,而且運作非常良好。

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.2 on 2017-10-16 13:48 
from __future__ import unicode_literals 

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

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

    # Criando Administrador 
    group, created = Group.objects.get_or_create(name='Administrador') 
    if created: 
     permissions_qs = Permission.objects.filter(
         codename__in=['add_permission', 
                'change_permission', 
                'add_user', 
                'change_user', 
                'add_video', 
                'change_video', 
                'delete_video', 
                'add_documents', 
                'change_documents', 
                'delete_documents', 
                'add_news', 
                'change_news', 
                'delete_news', 
                'add_basics', 
                'change_basics', 
                'add_board', 
                'change_board', 
                'delete_board', 
                'add_history', 
                'change_history', 
                'delete_history', 
                'add_shortcuts', 
                'change_shortcuts', 
                'delete_shortcuts',] 
     ) 
     group.permissions = permissions_qs 
     group.save() 

class Migration(migrations.Migration): 

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

    operations = [ 
     migrations.RunPython(add_group_permissions), 
    ] 

更新我的代碼後,我跑了,像小費@Trilliput:

  • manage.py migrate login zero --fake
  • 刪除該組
  • manage.py migrate login

回答

1

我認爲,您的新集團必須擁有所有權限。您所查詢的是wronge:

add_thing = Permission.objects.get(
        codename=['can_add_permision', 
           ... 
           'can_delete_shortcuts',] 
    ) 

隨着objects.get你一個請求許可使用代號等於給定名單,這是不可能的,因爲代號是一個字符串。您需要IN請求Permission.objects.filter(codename__in=['can_add_permision', ...])。而不是group.permissions.add(add_thing)你可能想要使用group.permissions = qs。但要注意,該權限將被覆蓋。這裏是一個完整的代碼:

# -*- coding: utf-8 -*- 
# Generated by Django 1.11.2 on 2017-10-16 13:48 
from __future__ import unicode_literals 

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


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

    # Criando Administrador 
    group, created = Group.objects.get_or_create(name='Administrador') 
    if created: 
     permissions_qs = Permission.objects.filter(
      codename__in=['can_add_permision', 
          'can_change_permission', 
          'can_add_user', 
          'can_change_user', 
          'can_add_video', 
          'can_change_video', 
          'can_delete_video', 
          'can_add_documents', 
          'can_change_documents', 
          'can_delete_documents', 
          'can_add_news', 
          'can_change_news', 
          'can_delete_news', 
          'can_add_basics', 
          'can_change_basics', 
          'can_add_board', 
          'can_change_board', 
          'can_delete_board', 
          'can_add_history', 
          'can_change_history', 
          'can_delete_history', 
          'can_add_shortcuts', 
          'can_change_shortcuts', 
          'can_delete_shortcuts',] 
     ) 
     group.permissions = permissions_qs 
     group.save() 
     logger.info('Grupo Administrador Criado') 

class Migration(migrations.Migration): 

    dependencies = [ 
    ] 

    operations = [ 
     migrations.RunPython(add_group_permissions), 
    ] 
+0

工作部分'cuz組創建空。謝謝! –

+0

@JulianoAraújo請確保您確實擁有所有權限。嘗試調用Django控制檯'Permissions.objects.filter(codename__in = ['can_add_permision',...,'can_delete_shortcuts',])。count()' – Trilliput

+0

@JulianoAraújo順便說一句,如果你想要所有的權限你可以使用'group.permissions = Permissions.objects.all()' – Trilliput