我正在尝试了解Django管理命令的工作方式。
当没有论据,或自我依靠时。我的命令工作正常。
当我向第二个函数'def add_arguments'添加参数时,似乎一个arg起作用了,但另一个没有注册。
我的命令如下:
from backend.tasks import MBCommand
import sys
class Command(MBCommand):
help = 'Refreshes MB data'
def add_arguments(self , parser):
parser.add_argument('event_id' , nargs='+' , type=int,
help='evid')
parser.add_argument('market_id', nargs='+', type=int,
help='marid')
def handle(self, *args, **kwargs):
self.mb_get_events()
event_ids = kwargs['event_id']
market_ids = kwargs['market_id']
for event_id in event_ids:
for market_id in market_ids:
self.mb_get_runners(event_id,market_id)
sys.exit()
我的两个功能是
from django.core.management.base import BaseCommand, CommandError
class MBCommand(BaseCommand):
def mb_get_events(self):
do something
def mb_get_runners(self, event_id, market_id):
do something
我在这里想念什么?
我如何运行命令(update_mb是命令的文件名)
python manage.py update_mb event_id market_id
错误。
usage: manage.py update_mb [-h] [--version] [-v {0,1,2,3}]
[--settings SETTINGS] [--pythonpath
PYTHONPATH]
[--traceback] [--no-color]
event_id [event_id ...] market_id [market_id
...]
manage.py update_mb: error: argument event_id: invalid int
value:
'event_id'
(butterbotenv) macs-MBP:butterbot mac$
最佳答案
正如我在对问题的评论中所说的:
该命令需要一个(或多个)类型为int
的参数。但正如错误所言,它无法将接收到的参数转换为int
。
尝试传递数字;代替
python manage.py update_mb event_id market_id
尝试使用这个(或类似的东西)
python manage.py update_mb 2 3 4
但是我注意到您的代码存在问题:您将
parser.add_argument(... nargs='+', ...)
用作两个参数。考虑一下我之前给出的示例:python manage.py update_mb 2 3 4
如何让命令知道哪些是
event_id
和哪些是market_id
?它如何为您工作?一种改进可以是使用可选参数。阅读有关Djangos custom management commands和基础Python
argparse
module的更多信息。它可能看起来像这样:
def add_arguments(self , parser):
parser.add_argument('--event', action='append', type=int)
parser.add_argument('--market', action='append', type=int)
要这样使用:
>>> python manage.py update_mb --event 2 --event 3 --market 4