Подтвердить что ты не робот

Django 1.7 где поставить код для добавления групп программно?

Я пытаюсь найти ответ в документах Django Auth, но, похоже, не могу найти то, что ищу.

Проблема, с которой я столкнулся, - это когда я определяю код для добавления групп (такие же, как группы на странице администратора):

#read_only
group, created = Group.objects.get_or_create(name='read_only')   
if created:
    group.permissions.add(can_read_campaign)
    logger.info('read_only_user Group created')
#standard
group, created = Group.objects.get_or_create(name='standard_user') 
if created:
    group.permissions.add(can_edit_users)
    logger.info('standard_user Group created')
#admin
group, created = Group.objects.get_or_create(name='admin_user') 
if created:
    group.permissions.add(can_edit_campaign, can_edit_users)
    logger.info('admin_user Group created')

Когда я запустил этот код в models.py и init.py, и они оба дают мне эту ошибку:

django.core.exceptions.AppRegistryNotReady

Я предполагаю, что это связано с тем, что Model/ init пытается вставить вещи в приложение /admin django слишком рано?

Помогло бы мне помочь мне с решением, чтобы я мог добавлять эти группы программно.

Спасибо.

EDIT:

Это не дублирующий вопрос, на самом деле это добавление разрешений и групп внутри моделей во время настройки проекта, а не через оболочку.

Я решил эти проблемы, используя сигналы и приемники (модули django).

Я добавил код для создания разрешений/групп в его собственную функцию и украсил его получателем (post_migrate), который будет запускать эту функцию после завершения миграции, удалив эту ошибку.

@receiver(post_migrate)
def init_groups(sender, **kwargs):
    #permission and group code goes here

Надеюсь, это поможет кому-то с этой проблемой!

4b9b3361

Ответ 1

Мне рекомендовали этот способ сделать это:

Создайте фальшивую миграцию в соответствующем модуле:

python manage.py makemigrations --empty yourappname

Откройте созданный файл, который должен выглядеть следующим образом:

# -*- coding: utf-8 -*-
from django.db import models, migrations

class Migration(migrations.Migration):

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

    operations = [
    ]

И добавьте свой код:

# -*- coding: utf-8 -*-
from django.db import models, migrations

def add_group_permissions():
    #read_only
    group, created = Group.objects.get_or_create(name='read_only')   
    if created:
        group.permissions.add(can_read_campaign)
        logger.info('read_only_user Group created')

    #standard
    group, created = Group.objects.get_or_create(name='standard_user') 
    if created:
        group.permissions.add(can_edit_users)
        logger.info('standard_user Group created')

    #admin
    group, created = Group.objects.get_or_create(name='admin_user') 
    if created:
        group.permissions.add(can_edit_campaign, can_edit_users)
        logger.info('admin_user Group created')

class Migration(migrations.Migration):

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

    operations = [
        migrations.RunPython(add_group_permissions),
    ]

Наконец, запустите миграцию:

python manage.py migrate

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