[英]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
可以(通过设计)拥有零父母,一个父母,两个父母,三个父母或更多。 此外,孩子可能有两个母亲,或两个父亲,或两个母亲和三个父亲。 因此,它可以导致许多额外的逻辑来防止某些情况。 请注意,在某些可能的国家/地区:在某些国家/地区可以将额外的人员列为“父母”,并且他们与父母具有相同的法律权利和义务。
但是,您可以通过查询来获取mother
或father
是self
所有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_parent
为mother_of
。 例如,如果您想要与母亲及其子女一起列出表格,或者您可以在Parent
改变性别的情况下提出申请,这可能会很有用。
如果你想拥有严格的Father
和Mother
,那么定义两个独立的模型可能是有益的。 其优点是,你既可以命名related_name
小号'children'
然后,进而通过设计 ,你检查的father
一的Child
是男性(以及类似的mother
是女性)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.