我需要运行管理/命令目录中包含的自定义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
的参数。
有没有可能形成这样的命令?如果没有,该如何交替实施该想法?
答案 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。