Django Wagtail查询Postman触发TypeError:str与int不支持'>='比较
错误根因
报错和你写的Q查询逻辑无关,根据错误堆栈定位,问题出在Django QuerySet的切片操作逻辑中:
- 模板调用
blog_post_filter函数时,传入的posts(对应请求参数number_of_posts)、skip_first(对应请求参数skip_first_posts)本身就是整数类型,切片操作正常运行 - Postman发起GET请求时,所有参数默认都是字符串类型,你从
request.GET中取出这两个参数后没有做类型转换就直接传入函数,执行到[skip_first:(skip_first+posts)]切片代码时,Django内部校验切片起始值合法性的逻辑触发了字符串和整数的比较报错。
修复方案
方案1(视图层修复,推荐)
在视图层调用blog_post_filter之前,先将数值类参数转换为整数:
# 示例:你视图里取参数的逻辑修改为如下 number_of_posts = int(request.GET.get('number_of_posts', 10)) skip_first_posts = int(request.GET.get('skip_first_posts', 0)) # 再把转换后的整数传入blog_post_filter blog_posts = blog_post_filter( selected=None, cats=categories, blog_pages=blogs, featured=filter_featured, posts=number_of_posts, skip_first=skip_first_posts, block_type=block_type )
方案2(函数层加固)
直接在blog_post_filter函数入口增加参数类型转换逻辑,避免其他调用方也出现同类问题:
def blog_post_filter(selected=None, cats=None, blog_pages=None, featured=None, posts=None, skip_first=None, block_type=None): # 新增参数类型校验转换 if posts is not None and isinstance(posts, str): posts = int(posts) if skip_first is not None and isinstance(skip_first, str): skip_first = int(skip_first) # 原有业务逻辑保持不变 BlogPage = apps.get_model('blog', 'BlogPage') BlogPost = apps.get_model('blog', 'BlogPost') Category = apps.get_model('blog', 'Category') # ... 后续代码和之前一致
内容的提问来源于stack exchange,提问作者Mahmud Abdur Rahman
相关产品推荐
相关产品推荐

