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 - 两次查询的结果不对称
问题:
- 我的模型结构是否适合对称表示婚姻关系?如果不合适,应该做哪些改进?
- 如何以数据库优化的方式高效查询一个人的所有配偶,同时保证对称性?
我的使用场景是用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
相关产品推荐
相关产品推荐

