2

有没有办法使用 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]

在不从数据库中检索整个树的情况下如何做到这一点?

4

1 回答 1

1

MPTT 使用预排序(这已经是深度优先搜索。)所以您需要做的就是在将查询集传递给递归树之前为其添加一个限制。

order_by()如果您将查询集传递给MPTT 调用recursetree,但如果您传递一个列表,它就不能这样做。这种行为有点令人困惑,也引起了其他人的问题。

在 MPTT 上创建了一张票来解决这个问题。

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

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

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

于 2013-11-24T20:41:32.353 回答