【问题标题】:Passing negative values as arguments to custom management commands in django将负值作为参数传递给 django 中的自定义管理命令
【发布时间】:2012-11-01 12:30:37
【问题描述】:

和许多其他人一样,我一直在通过构建一个测试应用来学习使用 django 进行 Web 开发。我已经建立了基本模型。我已经使用夹具填充了一些表,其中包含进一步测试所需的绝对最小数据。

现在对于不同的表,我想通过一个自定义管理命令创建数据元组,该命令采用所需的参数。如果这按预期工作,我将通过添加--save 选项将创建的数据保存到数据库中。

命令的语法是这样的

create_raw_data owner_id temperature [--save]

其中owner_id 是必需的,temperature(在 C 中)是可选的。在 Handle 方法中,我使用 factory boy 来创建带有给定参数等的 raw_data

我确实遇到了一些问题,但是在 SO、google、django docs 等上搜索,我的命令运行良好。

除非我输入负温度...

然后我得到以下错误

Usage: C:\test\manage.py create_raw_data [options] 

Creates a RawData object. Usage:  create_raw_data owner_id temperature [--save]

C:\test\manage.py: error: no such option: -5

我用来解析 args 的代码是这样的

for index, item in enumerate(args):
    if index == 0:
        owner_id = int(item)
    else index == 1:
        temp = int(item)

我将print(args) 作为Handle 内的第一行,但似乎控制还没有到达这里。

我不确定出了什么问题...请帮助...

非常感谢

【问题讨论】:

  • 搜索“django 转义字符” - 减号被视为选项的指示符,您必须告诉 django 这不是选项,而是您的参数之一
  • 如果你用反斜杠转义 - 会发生什么? \-5
  • 我无法让自定义命令正确调试。想通了这一点,再加上@KevinDTimm 的提示,似乎问题出在 optparse 的 parse_args 方法上。我在很多地方读到过,虽然 optparse 已被弃用,而是推荐使用 argparse,但 django 建议使用 optparse,因为这就是它所使用的。长话短说,link 的链接提出了一些替代方案,使用 create_raw_data 1 -- -5 可以按预期工作。所以我确实得到了解决方法。谢谢。
  • @dm03514 - 我首先尝试了 \-5。这给出了 ValueError: invalid literal for int() with base 10: '\\-5'
  • 既然问题已排序......我应该删除问题还是以某种方式将其标记为已回答......

标签: django


【解决方案1】:

已解决此问题,以便为可能遇到此问题的其他人提供答案。

问题出在 optparse 的 parse_args 方法上。我在很多地方读到过,虽然不推荐使用 optparse,而是建议使用 argparse,但 django 建议使用 optparse,因为它就是使用它。长话短说,链接上的链接提出了一些替代方案,使用create_raw_data 1 -- -5 可以按预期工作。所以我确实得到了解决方法。谢谢。

【讨论】:

    最近更新 更多