如何在Django中为City查询集添加visited布尔注解(关联当前用户)?
解决Django City查询集添加visited注解的问题
你的问题出在关联条件错误:title__in=queryset_visited试图用City的title匹配VisitedCity对象,逻辑不匹配且title可能存在重复,导致无法得到正确结果。
正确实现方式1:用Case/When关联City主键
先获取当前用户访问过的City主键列表,再通过主键匹配实现注解:
from django.db.models import Case, When, Value, BooleanField # 获取当前用户访问过的城市ID列表 visited_city_ids = VisitedCity.objects.filter(user=self.request.user).values_list('city_id', flat=True) # 为City查询集添加visited注解 queryset_all = City.objects.annotate( visited=Case( When(id__in=visited_city_ids, then=Value(True)), default=Value(False), output_field=BooleanField() ) )
更高效的实现方式:用Exists子查询
Django的Exists查询性能更优,它只需检测到匹配记录就停止查询,无需获取所有ID:
from django.db.models import Exists, OuterRef # 构建子查询:判断当前用户是否访问过当前City visited_subquery = VisitedCity.objects.filter( user=self.request.user, city=OuterRef('pk') ) # 注解visited字段 queryset_all = City.objects.annotate( visited=Exists(visited_subquery) )
说明
- 第二种方式(Exists)更推荐,数据量较大时性能优势明显
- 两种方式均可正确返回布尔类型的
visited字段,满足需求
内容的提问来源于stack exchange,提问作者Shecspi
相关产品推荐
相关产品推荐

