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

Django家谱应用中对称婚姻关系的建模与高效查询方案咨询

Django家谱应用中对称婚姻关系的建模与高效查询方案咨询

我正在用Django开发一个家谱应用,需要对称地表示和查询婚姻关系。每一段婚姻只需要一条记录,并且关系要包含双方,不能重复数据。以下是相关的模型结构:

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    spouses = models.ManyToManyField(
        'self', through="Marriage", symmetrical=True, related_name="partners"
    )
    

class Marriage(models.Model):
    person1 = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="marriages_as_person1")
    person2 = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="marriages_as_person2")
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)

我想要实现:

  • 确保双方都能对称地显示为彼此的配偶
  • 避免同一段婚姻出现重复记录
  • 高效查询一个人的所有配偶

我目前用来查询配偶的代码如下:

# Query spouses for a person
p1 = Person.objects.create()
p2 = Person.objects.create()
Marriage.objects.create(person1=p1, person2=p2)

p1.spouses.all()   # Returns list containing p2
p2.spouses.all()   # Returns empty list

但我遇到了一些问题:

  • 查询p1的配偶时应该包含p2,查询p2的配偶时也应该包含p1
  • 两次查询的结果不对称

问题:

  1. 我的模型结构是否适合对称表示婚姻关系?如果不合适,应该做哪些改进?
  2. 如何以数据库优化的方式高效查询一个人的所有配偶,同时保证对称性?

我的使用场景是用DRF返回如下格式的列表,其中每个Person对象包含pids(配偶ID列表):

[
  {
    id: 1,
    full_name: ‘John’,
    pids: [2]
  },
  {
    id: 2,
    full_name: ‘Mary’,
    pids: [1]
  }
]

当前的序列化器代码是:

def get_pids(self, obj):
    """
    Returns a list of IDs of all the spouses of the person, ensuring bidirectional relationships.
    """
    partner_ids = set(obj.spouses.values_list('id', flat=True))
    # Ensure bidirectional relationships
    for spouse in obj.spouses.all():
        partner_ids.update(spouse.spouses.values_list('id', flat=True))

    return list(partner_ids)

备注:内容来源于stack exchange,提问作者Anuj TBE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:03:04