Django вводит аргументы для call_command для пользовательского набора данных - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь создать пользовательский набор данных для приборов Django, чтобы не сваливать все в один файл.

вот мой код, который выдает ошибку:

extract.py

def create_fixture( filename, *app_name):
    # buffer
    buf = StringIO()
    # unpacks args to list of db tables
    apps = ','.join(map(str, app_name))
    # calls dump data and adds db table to call command
    call_command('dumpdata', apps, indent=2, format='json', stdout=buf)
    # Write to file
    buf.seek(0)
    with open(Path.cwd().joinpath('main', 'fixtures', filename), 'w') as f:
        f.write(buf.read())

class Command(BaseCommand):
    help = 'Dumps database file to fixtures'

    def handle(self, *args, **kwargs):
        #calls function
        create_fixture('country.json','main.Country','main.Cities')
        #prints to console if successful
        self.stdout.write("Dumped Country data!")

Если я запускаю python manage.py extract в консоли, я получаю следующее сообщение:

CommandError: No installed app with label 'main.Country,main.Cities'

Но если я напишу такой код, он будет работать нормально, ноне использует функцию:

class Command(BaseCommand):
    help = 'Dumps database file to fixtures'

    def handle(self, *args, **kwargs):
        buf = StringIO()
        call_command('dumpdata', 'main.Country', 'main.Cities',indent=2, format='json', stdout=buf)
        buf.seek(0)
        with open(Path.cwd().joinpath('main', 'fixtures', 'country.json'), 'w') as f:
            f.write(buf.read())
        self.stdout.write("Dumped Country data")

Не уверен, как правильно распаковать аргументы и поместить их в функцию call_command

1 Ответ

1 голос
/ 27 марта 2019

имя_приложения , которое вы передаете create_fixture , кортеж. Вам не нужно распаковывать их и конвертировать в строку.

Когда вы делаете это:

apps = ','.join(map(str, app_name))

Вы на самом деле сначала конвертируете его в список, а затем соединяете все его элементы с помощью , (запятая). Который дает вам только строку 'main.Country, main.Cities' .

просто передайте свой кортеж прямо сверху call_command .

call_command('dumpdata', *app_name, indent=2, format='json', stdout=buf)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...