将 GET 请求参数转换为 int ... 如果它是数字

Converting GET request parameter to int ... if it is numeric

假设我正在向用户显示一些数据,我希望用户能够使用 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 语句中处理这个问题

您收到此错误的原因是因为 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)

希望对您有所帮助:)

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

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

您应该使用带有一个或多个 IntegerField 的 Django 表单;他们为你做这个转换,然后你可以从 cleaned_data.

得到结果

此函数将 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