Django / Postgres: в запросе с условной аннотацией вернуть ArrayField с определенным значением в нем? - PullRequest
0 голосов
/ 29 ноября 2018

Я использую Python 2.7, Postgres 9.6 и Django 1.11.У меня есть модель, Person, с двумя CharField s, director_id и company_id.Я хотел бы аннотировать его в соответствии с определенным условием: когда director_id не равно нулю, выполните подзапрос, выполняя ArrayAgg, который возвращает мне массив company_id, связанных с ним (хорошо, получил это работает);когда это не так, я бы хотел вернуть массив длины 1, просто содержащий company_id для этого Person.Есть ли способ указать, что я хочу default вернуть массив с определенным значением в нем?

Person.objects.annotate(
    aggregated_company_ids=Case(
        When(director_id__isnull=False, then=Subquery(aggregated_company_ids)),
        default=[F("company_id")],  # ProgrammingError: can't adapt type 'F'
        output_field=ArrayField(models.CharField()),
    ),
)

1 Ответ

0 голосов
/ 29 января 2019

Я нашел ArrayAgg(F("company_id")) сработал и дал мне массив с одним company_id в нем:

Person.objects.annotate(
    aggregated_company_ids=Case(
        When(director_id__isnull=False, then=Subquery(aggregated_company_ids)),
        default=ArrayAgg(F("company_id")),
        output_field=ArrayField(models.CharField()),
    ),
)

Не уверен, что это единственное и лучшее решение, но это единственное, которое янашел.

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