Django使用Django queryset获取所有后代子模型

Mri*_*was 5 python django

我有带有自我参照的用户模型。现在,我需要为给定用户获取所有子代。

class MyUser(AbstractBaseUser, PermissionsMixin):
      .....
      parent = models.ForeignKey('self', blank=True, null=True, related_name ='children')
Run Code Online (Sandbox Code Playgroud)

用户A有子用户B

用户B有子用户C

用途C有子用户D

所以,如果我有给定的用户A,那么我想获得

用户B,C,D结果

如何使用Django查询做到这一点?

Cel*_*ian 5

聚会有点晚了,但我遇到了同样的问题。Selcuk 的回答引发了 AttributeError,我写了一个改进的函数(但对他们表示敬意)。对于我的用例,我还需要一种方法来查找所有父项,并且通过在我的clean方法中禁止循环关系来确保避免无限循环。

from django.core.exceptions import ValidationError

class MyUser(AbstractBaseUser, PermissionsMixin):
    parent = models.ForeignKey('self', blank=True, null=True, 
                related_name="children")

    def get_all_children(self):
        children = [self]
        try:
            child_list = self.children.all()
        except AttributeError:
            return children
        for child in child_list:
            children.extend(child.get_all_children())
        return children

    def get_all_parents(self):
        parents = [self]
        if self.parent is not None:
            parent = self.parent
            parents.extend(parent.get_all_parents())
        return parents

    def clean(self):
        if self.parent in self.get_all_children():
            raise ValidationError("A user cannot have itself \
                    or one of its' children as parent.")
Run Code Online (Sandbox Code Playgroud)


Sel*_*cuk 1

没有内置查询,但您可以编写自己的(递归)方法:

class MyUser(AbstractBaseUser, PermissionsMixin):
    ...
    def get_all_children(self):
        children = []
        for u in self.children.all():
            children.append(u.get_all_children())
        return children
Run Code Online (Sandbox Code Playgroud)

请注意,如果您不小心将实例链接到其自身(即子==父),这将进入无限循环。