Django外键有两种不同的对象

时间:2014-03-09 14:09:14

标签: django django-models recursive-datastructures

我有两种不同的模型:

class Parent(models.Model):
    # fields...

Class Child(models.Model):
    # if first child in the tree
    parent = models.ForeignKey(Parent)
    # else
    # parent = models.ForeignKey('self')

我的系统中只有一个父节点,它可以有多个子节点,每个子节点可以有多个子节点等。实现这种关系的正确方法是什么?我会如果有人知道如何处理这个问题,我想看看工作示例。

我对django-mptt感到满意,但听起来对我的需求过于复杂。我实际上在我的系统中建模真实的人际关系,所以通常父节点只有很少的孩子,其中一些可能也有很少的孩子,并且可能只有四个,也许五代同时存活。所以通常树包含大约十个节点的东西,甚至最大限制为几百个,这是非常罕见的情况。从那个角度看,效率并不是一件大事,所以我更喜欢最简单的解决方案。

1 个答案:

答案 0 :(得分:0)

我将使用与自身的ManyToMany关系,如此SO question中所述。

当然,你的degsign需要改变,没有父母和孩子,只有父母或人类或其他东西,从某种意义上说,有一天每个人都可能是父母:)

class Human(models.Model):
    children = models.ManyToManyField('self', blank=True)
    other_info = ...

example pagereference page会对您有帮助。

请注意,此设计不会以任何方式保护您免于创建“错误”关系。一个人可能是他自己的父亲或祖父或任何一种不可能的情况。在数据库中添加子项之前,您需要自己检查此问题。