Django mptt использует модифицированный метод обхода дерева предварительных заказов, как описано в документе Управление базами данных MySQL .
Он имеет следующий запрос для возврата всех узлов в дереве ниже aопределенный узел:
SELECT node.name
FROM nested_category AS node, nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.name = 'ELECTRONICS'
ORDER BY node.lft;
Секрет - числа parent.lft и parent.rgt, все дочерние элементы будут иметь значение node.lft между двумя.
Очевидно, что этот пример предполагает только одинродитель и что вам нужно использовать имя родителя, чтобы найти родителя.Поскольку у вас уже есть данные родительского узла, вы можете сделать что-то вроде следующего:
SELECT node.id
FROM node_table
WHERE node.lft BETWEEN parent[0].lft AND parent[0].rgt
OR node.lft BETWEEN parent[1].lft AND parent[1].rgt
Я оставлю это в качестве упражнения для вас, как сгенерировать отдельное предложение BETWEEN для каждого родительского узла (подсказка, "AND" .join)
В качестве альтернативы вы можете использовать генератор диапазона для каждого родителя, чтобы получить все значения между значениями lft и rgt каждого из родителей включительно.Это позволит вам использовать гигантский оператор IN, а не множество предложений BETWEEN.
Объедините любое из вышеперечисленного с набором RawQueryset, и вы получите модели обратно.