У меня есть древовидная структура в postgres, и я хочу получить количество вложенных узлов для каждого видимого узла, считая всех дочерних элементов, кроме скрытого дочернего элемента и его потомков. Вы можете посмотреть на запрос SQL, чтобы получить представление.
Я пытаюсь реализовать следующий запрос в Django 1.11.20:
select
id,
path,
(
select count(*)
from tree_node
where
path <@ t.path and
not path <@ array(
select path
from tree_node
where path <@ t.path and visibility_id = 0
)
) as nested_nodes
from tree_node t;
Что я пытаюсь:
TreeQuerySet.py
...
def annotate_visibile_nested_nodes_count(self):
"""
Get all nested nodes for current path except the hidden ones and their descendants
"""
from src.tree.models import Visibility
invisible_nested_nodes_paths = self.model.objects.filter(path__descendantsof=OuterRef(OuterRef('path')))\
.filter(visibility_id=Visibility.HIDE)\
.values('path')
visible_nested_nodes_count = self.model.objects.filter(path__descendantsof=OuterRef('path'))\
.exclude(path__descendantsin=Subquery(invisible_nested_nodes_paths))\
.annotate(count=Count('*'))\
.values('count')[:1]
return self.annotate(
nested_nodes=Subquery(visible_nested_nodes_count, output_field=IntegerField())
)
Я получаю сообщение об ошибке Django
:
File ".../django/db/models/expressions.py", line 237, in output_field
raise FieldError("Cannot resolve expression type, unknown output_field")
FieldError: Cannot resolve expression type, unknown output_field
Я не могу понять, является ли ошибка первой аннотацией или второй и как ее исправить. Я использую вложенный Subquery
, так как внутреннее большинство select относится к внешнему столбцу path
. Пользовательский поиск предназначен только для оператора postgres <@
.
Заранее спасибо за помощь.