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

如何为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,提问作者Андрей

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:02:38