2013-11-21 2 views
2

Есть ли способ представить частичное дерево с использованием Django-MPTT {% recursetree %}без получения всего дерева из базы данных? Мне нужно показать первые 20 узлов, с которыми сталкивается первый поиск глубины.Максимальные элементы Django MPTT в recursetree

Любой из них (которые не извлекают полное дерево) вызывает исключение:

# 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] 

Как я могу сделать это, не извлекая все дерево образуют БД?

ответ

1

MPTT использует предварительный заказ (который уже является поиском глубины.) Таким образом, все, что вам нужно сделать, это добавить ограничение к вашему запросу, прежде чем передавать его в recursetree.

MPTT вызывает order_by(), если вы передадите запрос на recursetree, но он не может этого сделать, если вы передадите список. Такое поведение несколько запутывает и вызывает проблемы других людей.

Я создал ticket on MPTT для решения этой проблемы.

В то же время, вы можете просто сделать нарезку перед списком() вызов:

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

Это сделает ограничение в базе данных, а затем преобразовать QuerySet в список, который вы можете перейти к recursetree, не пытаясь изменить порядок вещей.

+0

Спасибо, но это дает исключение в '{% recursetree%}'. См. Мой обновленный вопрос. – royron

+0

Так оно и есть. Отредактировано, чтобы исправить это. – craigds

Смежные вопросы