django 将GET请求参数转换为int ...(如果是数值)

xbp102n0  于 2023-04-22  发布在  Go
关注(0)|答案(5)|浏览(186)

假设我向用户显示一些数据,我希望用户能够使用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语句中处理这个问题,因为我可能会添加其他过滤器

kokeuurv

kokeuurv1#

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

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

oknwwptz2#

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

jyztefdp

jyztefdp3#

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

chhkpiq44#

你可以使用try/except块来使用更多的Python方式:

try:
    condition["code"] = int(code)
except ValueError:
    pass
cbjzeqam

cbjzeqam5#

你得到这个错误的原因是因为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)

希望有帮助:)

相关问题