我有一个模型,它与自己有很多很多关系。该模型有1个父母,很多孩子,1个伟大的......伟大的父母。我希望将父母链保存在模型中,这样我就可以简单地搜索具有与之关联的特定用户的对象,以便快速找到任何级别的后代。我想知道的是,如何在多种关系中取消他们所处的位置。 所以模型看起来像这样(不是实际的代码):
class Person:
user = onetoone(user)
greatgrandparent7generationsup = foreign(Person)
parents = many(user.user_name) //Geneology dad, grandad, greatgrandad .....
我有能够按顺序添加基因的代码,这没问题。 我可以弄清楚如何找到有人拥有的所有后代。 我想要做的就是找出我曾经拥有的那个后代我想知道他们所在的内容在哪里(通过确定他们是否是父母领域的第一个第二个第三......模型)。我试图避免深度优先搜索。这就是为什么我这样做的原因。
答案 0 :(得分:1)
您应该使用django-mptt
,它提供了开箱即用的此功能。
您的模型将是:
class Person(MPTTModel):
name = models.CharField(max_length=50, unique=True)
parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
现在,您可以执行以下操作:
from yourapp.models import Person
dad = Person.objects.create(name="Dad")
john = Person.objects.create(name='John', parent=dad)
jim = Person.objects.create(name='Jim', parent=john)
要解决您的血统问题,一旦您的树在数据库中,每个记录(节点)将具有以下methods:
get_ancestors(ascending=False, include_self=False)
get_children()
get_descendants(include_self=False)
get_descendant_count()
get_next_sibling()
get_previous_sibling()
get_root()
get_siblings(include_self=False)
insert_at(target, position='first-child', save=False)
is_child_node()
is_leaf_node()
is_root_node()
move_to(target, position='first-child')