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

如何用条件表达式判断指定用户是否存在于SiteMaster的QuerySet中

解决多对多关联下的注解字段问题

你的问题出在多对多字段直接用Q(site_user=user)无法正确判断关联关系,因为Case/When里的这个条件不会检查中间表SiteUser中是否存在对应记录。正确的做法是用Exists子查询来判断当前站点是否关联了指定用户。

正确代码示例

from django.db.models import Exists, OuterRef, Case, When, BooleanField

user = request.user
_sites = sites.annotate(
    flag=Case(
        # 如果当前站点关联了该用户,flag设为False(按你的需求调整)
        When(Exists(SiteUser.objects.filter(site=OuterRef('pk'), user=user)), then=False),
        default=True,
        output_field=BooleanField()
    )
)

逻辑说明

  • Exists(SiteUser.objects.filter(site=OuterRef('pk'), user=user)):检查当前SiteMaster(通过OuterRef('pk')指代外层查询的站点ID)是否在SiteUser表中有匹配user的记录。
  • 这个判断在数据库层面完成,和你之前的prefetch_related预取操作互不冲突,注解字段会直接被查询出来。

简化写法(可选)

如果你想换一种实现方式,也可以用Count统计关联记录数来判断(但Exists性能更优):

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

_sites = sites.annotate(
    user_count=Count('site_user', filter=Q(site_user=user)),
    flag=Case(
        When(user_count__gt=0, then=False),
        default=True,
        output_field=BooleanField()
    )
)

内容的提问来源于stack exchange,提问作者Abdul Rahman.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:20:38