向Django Q()对象动态传递键值对查询时遇到问题怎么解决?
问题解决方法
核心问题原因
原有写法Q(key= value)中,Python会将key识别为固定的参数字面量,而非循环中取到的动态字段名变量,相当于你一直尝试匹配模型中名为key的字段,自然无法得到预期结果。
修复方案
你可以通过**字典解包的方式传入动态键值对,将对应代码行修改为:
base_args.append(Q(**{key: value}))
更简化的写法优化
由于你当前所有的过滤条件都是AND逻辑,完全不需要手动拼接Q对象列表,直接合并过滤条件字典后传给filter方法即可,代码可以简化为:
from tmd import models category = { "utility": models.Account.UTILITY, "system": models.Account.SYSTEM } # 此处调整了字典键名,和后续调用的参数匹配,避免KeyError country = { "USA": models.Country.objects.get(name='USA'), "CA": models.Country.objects.get(name='CA'), } def get_a(stage=None, **kwargs): # 合并所有过滤条件到一个字典 filter_params = {"stage__in": stage} filter_params.update(kwargs) # 直接传入解包后的过滤字典 a_ids = models.Account.objects.filter(**filter_params).values_list('id', flat=True) print(f"Number of a_ids: {a_ids.count()}") return a_ids
注意事项
- 你原有调用代码
a_ids = get_a(country=country["USA"], category=category["utility"])中,最初定义的country字典键是"United States",和调用时的"USA"不匹配,会触发KeyError,上述优化代码已经同步调整了country字典的键名,你也可以根据自身需求调整对应匹配关系。
内容的提问来源于stack exchange,提问作者The Dan
相关产品推荐
相关产品推荐

