Django 如何在将对象添加到 ManyToManyField 时填充中间模型中'trough'字段?



我无法正确措辞,也无法在文档中找到它,但是在添加新对象时,如何添加到ManyToManyField的中间"通过"模型中?

请注意,这是一个递归关系,但我使用了ManyToMany,因为我不确定OneToOne是否支持"通过"模型(文档没有指定它)

此外,无论curr_partner字段如何,都将使用Person_Person,向其添加父/子关系等对象(Person中没有字段)(这是由于混淆了 ManyToManyField 是 SQL 关系数据库中输出表中的实际字段)

(我意识到我的模型有一些上下文/理论缺陷,但现在让我们抽象一下)

例如

Models.py :

class Person(models.Model):
objectid = models.AutoField(primary_key=True)
name = models.CharField()
curr_partner = models.ManyToManyField(
self, 
on_delete = models.CASCADE, 
through = Person_Person, #This lets you define the model that will act as an intermadiary
symmetrical = False, #This needs to be set with recursive relationships
)
class Person_Person(models.Model):
person_1 = models.ForeignKey(Person, ondelete=models.CASCADE)
person_2 = models.ForeignKey(Person, ondelete=models.CASCADE)
relation = models.ChoiceField(            
('P', 'Parent'),
('C', 'Child'),
('E', 'Engaged'),
('W', 'Widow'),
)

查询:

#Adding a married couple
father = Person(name = "John")
mother = Person(name = "Anna")
father.curr_partner.add( mother , through.relation = "Engaged") #???
#Adding a 'Child' relation
child = Person(name = "Billy")
#This makes sense??
p1 = Person_Person(person1 = father, person2 = child, relation = "Child")
p2 = Person_Person(person1 = mother, person2 = child, relation = "Child")

您可以通过保存关系模型的实例来创建关系,就像您(几乎)对子项所做的那样。你会有类似的东西

father = Person(name = "John")
mother = Person(name = "Anna")
marriage = Person_Person.objects.create(person1=father, person2=mother, relation="E")
p1 = Person_Person.objects.create(person1=father, person2=child, relation="C")
p2 = Person_Person.objects.create(person1 = mother, person2 = child, relation="C")

顺便说一句,您的curr_partner属性没有准确的名称,因为它实际上表示一个人的所有关系,而不仅仅是婚姻。也许您应该将其重命名为relationshipskindred,并拥有一个属性来获取该人的伴侣:

@property
def curr_partner(self):
try:
return self.relationships.objects.get(relation='E')
except Person_Person.DoesNotExist:
# No marriage relationship
return

最新更新