Django MPTT recursetree中的最大元素

时间:2013-11-21 07:01:31

标签: django django-templates django-mptt mptt

有没有办法使用Django-MPTT的{% recursetree %} 呈现部分树而不从数据库中检索整个树?我需要显示深度优先搜索遇到的前20个节点。

其中任何一个(不检索完整树)都会导致异常:

# resulting querySet passed to {% recursetree %} in template
Thing.objects.all()[:20]

# directly sliced in template
{% recursetree all_nodes|slice:":20" %} 

AssertionError while rendering: Cannot reorder a query once a slice has been taken

另一方面,这确实有效,但检索整个树:

 # resulting querySet passed to {% recursetree %} in template
 list(Thing.objects.all())[:20]

如果不从DB中检索整个树,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:1)

MPTT使用预订(已经是深度优先搜索。)因此,您需要做的就是在将查询集传递给recursetree之前为其添加限制。

如果您将查询集传递给order_by(),则MPTT会调用recursetree,但如果您传递列表,则无法执行此操作。这种行为有点令人困惑,也引起了其他人的问题。

我已经创建了一个ticket on MPTT来解决这个问题。

与此同时,您可以在list()调用之前进行切片:

list(Thing.objects.all()[:20])

这将在数据库中执行限制,然后将查询集转换为列表,您可以将其传递给recursetree,而不会尝试重新排序。