我有一个具有自引用外键关系的模型:

class Person(TimeStampedModel):
    name = models.CharField(max_length=32)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

现在我想要为一个人得到所有的多层次的子元素.我如何为它编写一个Django查询?它需要像递归函数一样工作.

推荐答案

您始终可以向模型添加递归函数:

编辑:根据SeomGi Han更正

def get_all_children(self, include_self=True):
    r = []
    if include_self:
        r.append(self)
    for c in Person.objects.filter(parent=self):
        _r = c.get_all_children(include_self=True)
        if 0 < len(_r):
            r.extend(_r)
    return r

(如果您有大量递归或数据,请不要使用此选项.)

仍建议使用errx建议的mptt.

编辑:2021,因为这个答案仍然受到关注:/

django-tree-queries代替!

Django相关问答推荐

如何在Django表单中传递self.请求数据?

如何在Django中显示文件大小

如何在Django REST框架中管理序列化程序?

如何自动删除 Django 模型中的字段值?

如何访问 django 模板中的字典值?

如何在 Django 模板中的计数器上进行 for 循环中断?

是否可以在没有模型的情况下创建自定义管理视图

Python / Django 中的 Unicode 与 UTF-8 混淆?

将现有 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?

Django,如何从模型表单的 Select 字段中删除空白 Select ?

通过 django shell 保存图像/文件

始终将用户包含在 django 模板上下文中

是否可以将 FastAPI 与 Django 一起使用?

Django 不调用模型清理方法

Django:如何编写查询以使用多列进行排序,通过模板显示

django 模板列表变量中的最后一个元素

django - 使用 get_or_create 自动创建用户时设置用户权限

Django中reverse()和reverse_lazy()的区别

Django 在 css 文件中使用背景图像的方法

关闭 Django Rest Framework ModelViewSet 的自动分页