You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:18:03