Набор запросов Django: не удается разрешить тип выражения, неизвестное выходное поле

#django #django-rest-framework #django-queryset #postgresql-9.5 #django-1.11

#django #django-rest-framework #django-queryset #postgresql-9.5 #django-1.11

Вопрос:

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

 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 , поскольку внутренний самый выбранный относится к самому внешнему path столбцу. Пользовательские запросы предназначены только для оператора postgres <@ .

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

Комментарии:

1. Поскольку мы действительно не знаем, где находится ваша строка 237, я могу просто сказать, что вам output_field=... где-то не хватает, возможно, в вашем Subquery(invisible_nested_nodes_paths, output_field=...)

2. Ошибка, которую я вставил, исходит из модуля Django django.db.models.expression . Я добавил output_field to Subquery , как вы предложили, но все равно получаю ошибку.

3. мой плохой для expression модуля ^^» разве вы не знаете строку вашего файла, которая вызвала эту ошибку?

4. К сожалению, трассировка стека не очень полезна. Это часть DRF, поэтому трассировка стека просто показывает, что ошибка произошла при компиляции запроса при вызове paginate_queryset метода в DRF, что, вероятно, является временем, когда запрос фактически выполняется.

5. Похоже, связано с тикетом code.djangoproject.com/ticket/30446 (Автоматически разрешает значение output_field для типов stdlib.). «Указание явного output_field для значения должно решить проблему». значение = Значение ( «некоторая строка», output_field=модели. TextField(), )