Django - 模型 - 递归检索叶节点的父节点

3

我有一个定义如下的User模型类:

class CustomUser(models.Model):
    user = models.OneToOneField(User)
    slug = models.SlugField(max_length=35, unique=True,help_text="URI dell'utente che appare sul browser")
    team = models.CharField(max_length=100, null=False, verbose_name="Team")
    area = models.CharField(max_length=100, null=False, verbose_name="Area")
    line_manager = models.ForeignKey('self', null=True, blank=True,related_name='parent')

我希望能够获取CustomUser的所有line_manager。 假设我有以下内容:

A
-B 
 -C

我想要检索的值是B和A,其中C是叶子。在Django中该如何实现?


可能是Django自递归外键过滤查询所有子项的重复问题。 - Jonas Grumann
我看了那篇帖子,但我想知道是否有更简洁和高效的方法(例如直接进行查询)来实现相同的结果。 - AntoG
好的,让我们等待并看看是否有人提出更好的解决方案。 - Jonas Grumann
1个回答

7
我还没有测试过,但它应该可以正常工作:
class CustomUser(models.Model):
    user = models.OneToOneField(User)
    slug = models.SlugField(max_length=35, unique=True,help_text="URI dell'utente che appare sul browser")
    team = models.CharField(max_length=100, null=False, verbose_name="Team")
    area = models.CharField(max_length=100, null=False, verbose_name="Area")
    line_manager = models.ForeignKey('self', null=True, blank=True,related_name='parent')

    def get_linemanagers(self):
        if self.line_manager is None:
            return CustomUser.objects.none()
        return CustomUser.objects.filter(pk=self.line_manager.pk) | self.line_manager. get_linemanagers()

希望它有所帮助。

我该如何编写一个类似的函数来执行相反的操作,即检索 CustomUser 的所有后代(不仅限于直接子级)? - AntoG
我已经尝试过了,但是出现了一个递归错误:RecursionError: maximum recursion depth exceeded while calling a Python object - kbdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接