Django如何查询多对多字段中包含指定主键的所有Subscription对象
Django自关联多对多字段查询方案
核心查询写法
你模型里定义的多对多字段名为connected_subscriptions,直接基于该字段构造过滤条件即可,分两种常用场景:
- 已拿到目标Subscription的实例对象:
# target_subscription 为你要匹配的关联对象实例 result = Subscription.objects.filter(connected_subscriptions=target_subscription)
- 仅持有目标Subscription的主键值
subscription_key:
# 用双下划线关联关联对象的主键字段即可 result = Subscription.objects.filter(connected_subscriptions__id=subscription_key)
注意事项
- 你初步思路里的字段名拼写错误,误写为
connected_subscription(少了末尾的s),查询时需要和模型中定义的字段名完全保持一致 - 你当前的模型没有设置
symmetrical=False,自关联多对多默认是对称关系,上述写法可以正常命中所有关联了目标对象的记录;如果你后续给字段加了symmetrical=False参数,需要根据你设置的related_name调整查询字段。
额外场景示例
如果你需要过滤结果时排除目标Subscription自身,可以叠加exclude条件:
result = Subscription.objects.filter(connected_subscriptions__id=subscription_key).exclude(id=subscription_key)
内容的提问来源于stack exchange,提问作者Andrea Costanzo
相关产品推荐
相关产品推荐

