有没有办法使用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中检索整个树,我怎么能这样做呢?
答案 0 :(得分:1)
MPTT使用预订(已经是深度优先搜索。)因此,您需要做的就是在将查询集传递给recursetree之前为其添加限制。
如果您将查询集传递给order_by()
,则MPTT会调用recursetree
,但如果您传递列表,则无法执行此操作。这种行为有点令人困惑,也引起了其他人的问题。
我已经创建了一个ticket on MPTT来解决这个问题。
与此同时,您可以在list()调用之前进行切片:
list(Thing.objects.all()[:20])
这将在数据库中执行限制,然后将查询集转换为列表,您可以将其传递给recursetree
,而不会尝试重新排序。