Python 如何在Django 1.11.2中自动创建组

Python 如何在Django 1.11.2中自动创建组,python,django,Python,Django,我尝试遵循本教程“”,我的代码是: # -*- 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.

我尝试遵循本教程“”,我的代码是:

# -*- 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.
问题是否可能与
依赖关系相关?或者我怎么做

[更新1]

在@Trilliput提示之后,该组被创建为空

[更新2]

在使用了@Trilliput的技巧之后,我删除了前缀
can
,使用了shell
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迁移登录零-假
  • 删除组
  • manage.py迁移登录

我假设您的新组必须拥有所有权限。您的查询是错误的:

    add_thing = Permission.objects.get(
                     codename=['can_add_permision',
                               ...
                               'can_delete_shortcuts',]
    )
使用
objects.get
您请求的权限中,代码名等于给定的列表,这是不可能的,因为代码名是一个字符串。您需要
中的
请求
权限.objects.filter(codename\u\u IN=['can\u add\u Permission',…])
。而不是
group.permissions.add(添加东西)
您可能需要使用
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),
    ]

我假设您的新组必须拥有所有权限。您的查询是错误的:

    add_thing = Permission.objects.get(
                     codename=['can_add_permision',
                               ...
                               'can_delete_shortcuts',]
    )
使用
objects.get
您请求的权限中,代码名等于给定的列表,这是不可能的,因为代码名是一个字符串。您需要
中的
请求
权限.objects.filter(codename\u\u IN=['can\u add\u Permission',…])
。而不是
group.permissions.add(添加东西)
您可能需要使用
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),
    ]

“部分工作”,因为组为空。谢谢@JulianoAraújo确保您确实拥有所有权限。尝试在Django控制台中调用Permissions.objects.filter(codename\uu in=['can\u add\u permission',…,'can\u delete\u shortcuts',]).count()
@JulianoAraújo,顺便说一句,如果你想要所有的权限,你可以只使用
group.Permissions=Permissions.objects.all()
这不是所有的权限,是一些。例如,此组不能
可以\u删除\u权限
。我将在控制台中尝试查看。我使用了您关于在控制台中尝试的提示。。。我有更新2.Works的结果,因为组是空的。谢谢@JulianoAraújo确保您确实拥有所有权限。尝试在Django控制台中调用Permissions.objects.filter(codename\uu in=['can\u add\u permission',…,'can\u delete\u shortcuts',]).count()
@JulianoAraújo,顺便说一句,如果你想要所有的权限,你可以只使用
group.Permissions=Permissions.objects.all()
这不是所有的权限,是一些。例如,此组不能
可以\u删除\u权限
。我将在控制台中尝试查看。我使用了您关于在控制台中尝试的提示。。。我有更新2的结果。