在 Django 中,我如何根据它们添加到 ManyToMany 字段的顺序搜索相关模型?

2024-09-30 16:39:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,它和自己有很多关系。模特有一个父母,很多孩子,一个伟大的……祖父母。我希望将父级链存储在模型中,这样我就可以简单地搜索与它们相关联的某个用户的对象,以便在任何级别上快速查找decents。我想知道的是,我怎样才能知道他们在众多的关系中处于什么样的地位。 所以模型看起来像这样(不是实际的代码):

class Person:
user = onetoone(user)
greatgrandparent7generationsup = foreign(Person)
parents = many(user.user_name) //Geneology dad, grandad, greatgrandad ..... 

我有一个代码,可以把基因顺序添加进去,这没问题。 我能找到一个人所有的体面的人。 我想知道的是,一旦我有了那个权利,我想知道他们在里尼格的什么地方(通过确定他们的第一,第二,第三。。。。父字段中的模型)。我尽量避免深度优先搜索。所以我才这样做。你知道吗


Tags: 对象代码用户模型关系孩子级别class
1条回答
网友
1楼 · 发布于 2024-09-30 16:39:49

您应该使用^{},它提供了开箱即用的特性。你知道吗

您的模型将是:

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')

相关问题 更多 >