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

如何在Django注解中通过QuerySet的ID从字典插入对应值?

问题分析

你当前的写法错误在于:F("user_id")是Django的查询表达式,它仅在数据库执行查询时才会解析为实际的user_id值,而my_dict.get()是Python层面的字典操作,此时F("user_id")只是一个未解析的对象,并非实际的ID数值,所以字典无法匹配到对应键,返回None,最终导致is_admin字段为null。

解决方案

使用Django的Case和When实现数据库层面的条件映射,这是跨数据库兼容的方案:

from django.db.models import Case, When, BooleanField, Value

my_dict = {1: True, 2: False}

# 遍历字典生成对应的When条件
when_clauses = [
    When(user_id=uid, then=Value(val, output_field=BooleanField()))
    for uid, val in my_dict.items()
]

# 用Case注解添加is_admin字段
queryset = queryset.annotate(
    is_admin=Case(
        *when_clauses,
        default=Value(False, output_field=BooleanField()),  # 处理不在字典中的user_id,可按需修改默认值
        output_field=BooleanField()
    )
)

补充说明

  • 如果你的user_id可能为null,default会自动处理这类情况,返回你指定的默认值(示例中为False)。
  • 该方案完全在数据库层面完成映射,避免了将QuerySet加载到Python内存再处理的性能损耗。

内容的提问来源于stack exchange,提问作者Leonardo Furtado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:15:43