通过执行另一个程序获得的Django管理命令参数

时间:2019-02-03 21:23:23

标签: python django django-management-command

我需要运行管理/命令目录中包含的自定义Django管理命令(名为populate_db.py的模块)。它填充数据库。

restaurant/
    __init__.py
    models.py
    management/
        commands/
            _private.py
            populate_db.py
    tests.py
    views.py
    formDict.py

我希望命令将必选参数作为字典。可以从另一个名为formDict.py

的程序的执行中获得提到的字典。

所以我想要一个单行命令,该命令将运行formDict.py并连续将其结果作为自定义Django管理命令python manage.py populate_db的参数。

有没有可能形成这样的命令?如果没有,该如何交替实施该想法?

2 个答案:

答案 0 :(得分:1)

如果fromDict.py打印到终端(STDOUT),则可以使用Check if single element is contained in Numpy Array|)在管理命令中从pipe获取参数,可以使用sys.stdin。您可能想单独执行命令,所以也可以按参数接受字符串。

您的管理命令如下所示:

# populate_db.py
import argparse
import ast
import sys

from django.core.management.base import BaseCommand, CommandError


class Command(BaseCommand):
    help = 'Polulate the Database'

    def add_arguments(self, parser):
        parser.add_argument(
            'input_dict',
            nargs='?',
            type=str,
            default=None
        )

    def handle(self, *args, **options):
        if options['input_dict']:
            input_dict = options['input_dict']
        else:
            input_dict = sys.stdin.read()

        try:
            data = ast.literal_eval(input_dict)
        except SyntaxError:
            raise CommandError(f'Invalid dict input: {input_dict}')

        # populate the DB with data

您可以执行以下命令之一:

从STDIN获取命令

python fromDict.py | python yourproject/manage.py populate_db

通过参数传递字典

python yourproject/manage.py populate_db '{'some': 'dict'}'

注意:如果dict来自不受信任的来源,请当心STDIN,因为有人可以利用它(例如,值很大)来破坏python解释器。

答案 1 :(得分:0)

将formDict的逻辑包装在函数中。在populate_db.py的handle函数中调用它以访问从form_dict返回的结果。

将formDict.py移动到management / commands /,并在formDict中使用call_command调用populate_db。 https://docs.djangoproject.com/en/2.1/ref/django-admin/#running-management-commands-from-your-code