Django миграция данных: передать аргумент RunPython - PullRequest
0 голосов
/ 14 июля 2020

Я хотел бы использовать миграцию данных для добавления и удаления групп.

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

groups = ["Test Group"]


def add_groups(apps, schema_editor):
    # https://code.djangoproject.com/ticket/23422
    for group in groups:
        group, created = Group.objects.get_or_create(name=group)
        if created:
            print(f'Adding group {group}')

class Migration(migrations.Migration):

    operations = [
        migrations.RunPython(add_groups),
    ]

Функция использует переменную из внешней области видимости. Я хотел бы переместить функцию в другое место, чтобы можно было повторно использовать ее в новых миграциях. Однако мне кажется, что я не могу передать аргументы функции в Run Python. Как я могу добиться этого с помощью migrations.RunPython(add_groups(groups=groups))?

1 Ответ

1 голос
/ 14 июля 2020

Сначала создайте собственный класс.

from django.db import router


class CustomRunPython(migrations.RunPython):
    def __init__(self, *args, **kwargs):
        self.context = kwargs.pop('context', {})
        super().__init__(*args, **kwargs)

    def database_forwards(self, app_label, schema_editor, from_state, to_state):
        from_state.clear_delayed_apps_cache()
        if router.allow_migrate(schema_editor.connection.alias, app_label, **self.hints):
            self.code(from_state.apps, schema_editor, **self.context)

Примечание: Здесь мы используем context в качестве параметра инициализации, который, как ожидается, будет dict object.

и теперь используйте этот новый CustomRunPython в своем файле миграции и передайте context data,

class Migration(migrations.Migration):
    operations = [
        CustomRunPython(add_groups, <b>context={'groups': ["Test Group"]}</b>),
    ]

и теперь измените вашу функцию пересылки , чтобы принять контекст,

def add_groups(apps, schema_editor,<b> **context</b>):
    <b>groups = context['groups']</b>
    for group in <b>groups</b>:
        group, created = Group.objects.get_or_create(name=group)
        if created:
            print(f'Adding group {group}')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...