如何在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
相关产品推荐
相关产品推荐

