Как я могу инициализировать имена групп в Django при каждом запуске программы? - PullRequest
1 голос
/ 11 февраля 2020

У меня есть этот код, и я хочу, чтобы он просто создавал группы при каждом запуске программы, так что если база данных будет удалена, она все равно будет достаточной программой, и кому-то не придется создавать группы снова, знаете ли вы простой способ сделать это?

system_administrator = Group.objects.get_or_create(name='system_administrator')
    manager = Group.objects.get_or_create(name='manager')
    travel_advisor = Group.objects.get_or_create(name='travel_advisor')

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Если вы потеряете свою БД, вам придется перезапустить миграцию со скоростью sh дБ, прежде чем программа сможет снова запуститься. Так что я думаю data migrations может быть хорошим решением для этого? Миграция данных - это миграция, которая запускает код python для изменения данных в БД, а не схему, как обычная миграция.

Вы можете сделать что-то вроде этого:

In новый файл миграции (вы можете запустить python manage.py makemigrations --empty yourappname, чтобы создать пустой файл миграции для приложения)


def generate_groups(apps, schema_editor):

    Group = apps.get_model('yourappname', 'Group')
    Group.objects.get_or_create(name="system_administrator")
    Group.objects.get_or_create(name="manager")
    Group.objects.get_or_create(name="travel_advisor")


class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', 'previous migration'),
    ]

    operations = [
        migrations.RunPython(generate_groups),
    ]

Стоит прочитать документы по этой https://docs.djangoproject.com/en/3.0/topics/migrations/#data -миграции

2 голосов
/ 11 февраля 2020

Вы можете сделать это с помощью метода ready одного из ваших приложений.

class YourApp(Appconfig):

    def ready(self):
        # important do the import inside the method
        from something import Group

        Group.objects.get_or_create(name='system_administrator')
        Group.objects.get_or_create(name='manager')
        Group.objects.get_or_create(name='travel_advisor')

Проблема с подходом миграции данных заключается в том, что он полезен для заполнения базы данных. первый раз. Но если группы будут удалены после выполнения миграции данных, вам нужно будет заполнить их снова.

Также помните, что get_or_create возвращает кортеж.

group, created = Group.objects.get_or_create(name='manager')
# group if an instance of Group
# created is a boolean
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...