Django QuerySet: не удается разрешить тип выражения, неизвестное поле вывода - PullRequest
1 голос
/ 09 апреля 2019

У меня есть древовидная структура в 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 <@.

Заранее спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...