Django: вернуть массив в подзапрос - PullRequest
0 голосов
/ 29 июня 2018

У меня есть модель Application, в которой много Judge объектов, назначенных ей через ForeignKey. Каждый Judge оценивает Application. Я хочу вернуть список приложений в QuerySet вместе с массивом каждого из значений оценки. Вот как я пытаюсь это сделать:

total_scores = Subquery(
    Judge.objects
    .filter(
        application=OuterRef('pk')
    )
    .values_list(
        'total_score',
        flat=True
    )
)

applications = Application.objects \
    .annotate(
        score_array=total_scores
    )

Но я получаю эту ошибку:

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

values_list должен возвращать массив значений, поэтому я не уверен, почему из моего подзапроса возвращаются несколько строк. Есть указатели? Спасибо.

1 Ответ

0 голосов
/ 29 июня 2018

Прежде всего, массивы, как правило, не являются хорошо реализованной структурой в большинстве (всех) баз данных, поэтому я бы посоветовал держаться от нее как можно дальше. Тем более что он структурирует построчные данные в один столбец, что затрудняет выполнение JOIN с и т. Д.

Но если вы действительно этого хотите, вы можете использовать агрегатную функцию ArrayAgg. Это, однако, специфичная для PostgreSQL функция , поэтому вы теряете некоторую свободу выбора другой системы баз данных.

Тогда вы, вероятно, сможете получить такой результат с помощью:

from django.contrib.postgres.aggregates import <b>ArrayAgg</b>

Application.objects.annotate(
    score_array=<b>ArrayAgg('judge__total_score')</b>
)

Так что для этого не требуется SubQuery.

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