如何用条件表达式判断指定用户是否存在于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.
相关产品推荐
相关产品推荐

