如何为ABSLoyaltyCard模型添加is_my_card注解并筛选关联数据?
给ABSLoyaltyCard添加is_my_card注解的最优实现
已知用户Bob(对应CardToOwner的owner字段),需要获取所有ABSLoyaltyCard数据,并给每条数据添加注解字段is_my_card——当该卡片与Bob在CardToOwner中存在关联时为True,否则为False。最优实现方式如下:
核心实现代码
首先导入必要的模块:
from django.db.models import Exists, OuterRef from .models import ABSLoyaltyCard, CardToOwner
获取Bob对应的Guest实例(根据实际业务逻辑获取,比如通过ID、用户名等):
bob_guest = Guest.objects.get(id=bob_id) # 替换为实际获取Bob的方式
构建查询并添加注解:
all_cards = ABSLoyaltyCard.objects.annotate( is_my_card=Exists( CardToOwner.objects.filter( card_frame=OuterRef('pk'), owner=bob_guest ) ) )
为什么这是最优方案?
- 性能高效:
Exists子查询在数据库层面仅做存在性检查,不会执行全表关联或聚合计算,相比用Count结合Case/When的方式,能大幅减少数据库的计算开销,数据量较大时优势尤为明显。 - 逻辑清晰:直接通过ORM原生语法表达“是否存在关联”的业务逻辑,代码可读性强,维护成本低。
- 返回值精准:直接返回布尔类型结果,完全符合
is_my_card字段的需求,无需额外类型转换。
使用示例
遍历查询结果时,可直接访问每个卡片对象的is_my_card属性:
for card in all_cards: print(f"卡片标题:{card.title},是否为Bob的卡片:{card.is_my_card}")
内容的提问来源于stack exchange,提问作者Андрей
相关产品推荐
相关产品推荐

