【问题标题】:Converting GET request parameter to int ... if it is numeric将 GET 请求参数转换为 int ... 如果它是数字
【发布时间】:2017-01-12 01:29:41
【问题描述】:

假设我正在向用户显示一些数据,我希望用户能够使用 GET 表单对数据库中的数字字段执行某种过滤,所以我有这样的东西

code = request.GET.get('code')
condition = {} 
if( code is not None and int(code) > 0 ):
  condition['code'] = int(code)

Somemodel.objects.filter(**condition)

但这仅在我的代码包含数字时才有效,否则我会收到此错误

invalid literal for int() with base 10: ''

那么处理这个问题的pythonic方法是什么?我应该使用try/except 块吗?考虑到我可能会添加其他过滤器,我更喜欢在同一个 if 语句中处理这个问题

【问题讨论】:

标签: python django python-3.x django-1.9


【解决方案1】:

isnumeric 可以检查code 是否可以强制转换int 并检查code 是否为正数(当转换为整数时),从而替换int(code) > 0

if code is not None and code.isnumeric():
    condition['code'] = int(code)

【讨论】:

  • isnumeric() 需要一个 unicode 字符串?因为我得到“22”的 AttributeError 但对 u“22”工作正常。
  • @SunilLulla 使用 Python 3.x 标签,我认为这应该适用于所有字符串(默认情况下是 unicode)。对于 Python 2,您可以使用 isdigit
  • 在 python 2.x 中我更喜欢 type() 来检查 int 和其他数据类型,这是错误的检查方式吗?
  • @SunilLulla 在这种情况下,您不能使用type 来检查int,因为code 是一个字符串。但一般来说,您应该考虑使用处理继承的isinstance
【解决方案2】:

您应该使用带有一个或多个 IntegerFields 的 Django 表单;他们为你做这个转换,然后你可以从cleaned_data得到结果。

【讨论】:

    【解决方案3】:

    此函数将 GET 参数相应地转换为 python numeric/bool:

    def convert_params_to_int_or_bool(params):
        for k, v in params.items():
            if v.isnumeric():
                params[k] = int(v)
            if v == 'false':
                params[k] = False
            if v == 'true':
                params[k] = True
    

    【讨论】:

      【解决方案4】:

      您收到此错误的原因是 int() 期望它可以是表单字符串中的数字值,但它应该是像“22”、“33”等有效的数字。

      但是在您的情况下,您传递的是空的,这就是它引发错误的原因。您可以使用 type() 实现您想要的输出,它可以帮助您检查数字的类型

      所以修改后的代码是

          code = request.GET.get('code')
          condition = {} 
          if( code is not None and type(code) == int ):
                 condition['code'] = int(code)
      
          Somemodel.objects.filter(**condition)
      

      希望对你有帮助:)

      【讨论】:

      • 除非type(code) 在那个阶段永远不会是int 类型...它始终是一个可以为空的字符串,或者可能是也可能不是有效的int...
      • 您可以在上述检查之后应用其他检查,例如验证数字字段等,您能否详细说明您的条件?
      猜你喜欢
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多