繁体   English   中英

Django多个外键,相同的相关名称

[英]Django multiple foreign key, Same related name

我想创建一个带有多个外键的模型(1)到同一个其他模型(2)。 我希望这些外键具有相同的related_name因为每个外键将指向model(2)的差异实例,因为我需要一个所有外键的反向关系。

也许一个例子会更明确:

class Parent(Model):
    name = models.CharField(max_length=100)

class Child(Model):
    name = models.CharField(max_length=100)
    father = models.ForeignKey(Parent, related_name='children')
    mother = models.ForeignKey(Parent, related_name='children')

我怎样才能做到这一点 ?

我已经知道一种丑陋的方式:

class Parent(Model):
    name = models.CharField(max_length=100)

    @property
    def children(self):
         # Pick the existing one in fields 'children_1' or 'children_2'

class Child(Model):
    name = models.CharField(max_length=100)
    father = models.ForeignKey(Parent, related_name='children_1')
    mother = models.ForeignKey(Parent, related_name='children_2')

related_names不能相同,因为这会引起混淆: 通过 mother相关的对象与通过father相关的对象不完全相同。

您可以更改建模(例如,通过向Parent引入ManyToManyField ,例如在Parent关系的性别关系中添加额外数据)。 但是这种方法的一个缺点是,现在,你不再将关系的基数设置为2:这意味着一个Child可以(通过设计)拥有零父母,一个父母,两个父母,三个父母或更多。 此外,孩子可能有两个母亲,或两个父亲,或两个母亲和三个父亲。 因此,它可以导致许多额外的逻辑来防止某些情况。 请注意,在某些可能的国家/地区:在某些国家/地区可以将额外的人员列为“父母”,并且他们与父母具有相同的法律权利和义务。

但是,您可以通过查询来获取motherfatherself所有Child对象来定义此类属性以获取children

from django.db.models import Q

class Parent(Model):
    name = models.CharField(max_length=100)

    @property
    def children(self):
         return Child.objects.filter(Q(mother=self) | Q(father=self))

例如,您可以将相关名称命名为'father_of''mother_of' ,以便查询some_parent.mother_of以获取some_parentmother_of 例如,如果您想要与母亲及其子女一起列出表格,或者您可以在Parent改变性别的情况下提出申请,这可能会很有用。

如果你想拥有严格的FatherMother ,那么定义两个独立的模型可能是有益的。 其优点是,你既可以命名related_name小号'children'然后,进而通过设计 ,你检查的father一的Child是男性(以及类似的mother是女性)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM