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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:35:10