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

Django模型反向关联查询:如何通过Marriage的ID筛选Person对象

解决Django中通过Marriage ID筛选关联Person的问题

嘿,我来帮你搞定这个查询问题!咱们先理清楚问题出在哪,再一步步解决。

首先,你的Marriage模型里给两个ForeignKey设置了related_name='person'和related_name='person_2',这两个命名其实有点容易混淆,但核心问题是:要找到和ID为32的Marriage关联的所有Person,你需要同时考虑Person作为第一个关联对象和作为第二个关联对象这两种情况,这时候就得用到Django的Q对象来组合查询条件。

正确的查询方式

首先要导入Q对象:

from django.db.models import Q

然后用以下语句查询:

Person.objects.filter(Q(person__id=32) | Q(person_2__id=32))

解释一下:

  • Q(person__id=32):匹配所有作为Marriage(ID=32)中person字段的Person对象(这里的person就是你设置的related_name)
  • Q(person_2__id=32):匹配所有作为Marriage(ID=32)中person_2字段的Person对象
  • |是逻辑“或”的意思,把两个条件组合起来,就能拿到这个婚姻关系里的两个人了

优化建议:给related_name起更清晰的名字

你当前的related_name命名太模糊,时间久了容易搞混。建议改成更直观的名字,比如:

class Marriage(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='marriages_as_first_person')
    person_2 = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='marriages_as_second_person')

之后查询就更清晰了:

Person.objects.filter(Q(marriages_as_first_person__id=32) | Q(marriages_as_second_person__id=32))

更直接的方式:从Marriage对象获取关联Person

如果不需要用Person的QuerySet,只是想拿到ID=32的婚姻对应的两个人,也可以直接这样做:

marriage = Marriage.objects.get(id=32)
related_people = [marriage.person, marriage.person_2]

内容的提问来源于stack exchange,提问作者Marcel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:38:14