【问题标题】:Django how to populate fields in 'trough' intermediate model when adding an object to a ManyToManyField?将对象添加到 ManyToManyField 时,Django 如何在“槽”中间模型中填充字段?
【发布时间】:2016-11-21 18:40:48
【问题描述】:

我无法正确使用它,也无法在文档中找到它,但是在向 ManyToManyField 添加新对象时,我该如何添加到中间“通过”模型?

请注意,它是一种递归关系,但我使用了ManyToMany,因为我不确定OneToOne 是否支持“通过”模型(文档未指定)

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

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

例如

模型.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")

【问题讨论】:

    标签: python django django-models many-to-many


    【解决方案1】:

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

    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
    

    【讨论】:

    • 谢谢!我实际上是想为它找到一个更好的术语
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2019-10-04
    • 2018-12-16
    • 2020-06-11
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多