如何在Django中动态构建__lte查询条件以避免硬编码?
Django动态字段过滤的解决方案
你当前代码里的type__lte会被Django识别为字面量字段名,而非你传入的type变量对应的字段,所以需要用字典解包的方式传递动态生成的查询条件,修改后的代码如下:
def get_rating_average(self, type): # 简化聚合结果的取值逻辑,指定别名后直接通过key获取更直观 avg_result = super().aggregate(avg=Avg(type)) return avg_result['avg'] def filter_rating_average_under(self, type): # 动态构造查询条件字典,将传入的字段名与查询后缀拼接为key filter_condition = {f"{type}__lte": self.get_rating_average(type=type)} # 用**解包字典,作为filter的关键字参数传入 return super().filter(**filter_condition)
关键说明:
- 动态生成查询条件时,需要把字段名和查询操作符(比如
__lte)拼接成字典的键,对应的值为过滤阈值 - 使用
**语法将字典解包为filter()方法的关键字参数,Django就能正确识别动态传入的字段名了 - 优化了
get_rating_average的取值逻辑,避免了转列表取索引的冗余操作
内容的提问来源于stack exchange,提问作者micho
相关产品推荐
相关产品推荐

