1

我需要运行管理/命令目录中包含的自定义 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 并连续将其结果作为我的 Custom Django Management Command 的参数python manage.py populate_db

有可能形成这样的命令吗?如果没有,如何实现这个想法?

4

2 回答 2

1

如果fromDict.py打印到终端 (STDOUT),您可以在管理命令中使用管道( |) 从STDIN获取参数,您可以使用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来自不受信任的来源,请注意literal_eval,因为有人可以利用它(例如具有非常大的值)来破坏python解释器。

于 2019-02-04T02:00:20.287 回答
0

将 formDict 的逻辑包装在一个函数中。在 populate_db.py 的句柄函数中调用它以访问从 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

于 2019-02-04T00:51:09.133 回答