DRF菜单API过滤功能失效问题求助
DRF菜单API过滤功能失效问题求助
嗨,Lorenzo,我看了你的代码和问题描述,大概率是这几个地方出了问题,咱们一个个排查:
1. 语法错误导致逻辑中断
你代码里有一行明显的语法错误:
if search:. # 这里多了个多余的点!
这个语法错误会直接导致Python解释器报错,后续的过滤逻辑根本无法执行,甚至可能让接口返回空数据或500错误。先把这个点删掉,改成if search:。
2. to_price类型不匹配问题
request.query_params获取到的参数都是字符串类型,而你的MenuItem模型里的price应该是数字类型(比如DecimalField或FloatField)。直接用字符串和数字做lte比较会导致匹配失效,必须先把to_price转换成对应数字类型:
if to_price is not None: try: # 根据你模型里的字段类型,选float或Decimal转换 to_price = float(to_price) items = items.filter(price__lte=to_price) except ValueError: # 如果参数不是合法数字,可以返回错误提示或忽略该过滤条件 pass
3. 分类过滤的字段可能不匹配
你用了category__title=category_name做精确匹配,但要确认你的Category模型里的名称字段是不是真的叫title?很多教程里Category的名称字段是name,如果你的模型里也是name,那这里要改成category__name=category_name。另外,如果前端传的分类名称和数据库里的大小写不一致(比如前端传dessert,数据库里是Dessert),精确匹配会找不到数据,建议改成大小写不敏感的模糊匹配:
if category_name: items = items.filter(category__title__icontains=category_name)
4. 调试技巧:查看实际执行的SQL
如果上面的修改还是不行,建议打印最终QuerySet的SQL语句,看看实际执行的查询是什么,能快速定位问题:
# 在序列化之前添加这行打印 print(items.query) serialized_item = MenuItemSerializer(items, many=True)
运行后看控制台输出的SQL,就能清楚过滤条件是否正确拼接,或者是不是字段名写错了。
先试试这几个方案,应该能解决你的问题!
备注:内容来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

