Исключить нулевые значения из ArrayAgg Джанго - PullRequest
1 голос
/ 11 марта 2019

Я использую специфичный для postgres агрегатор Django ArrayAgg.Это работает нормально, но когда список пуст, я получаю [None] вместо [].Есть ли способ отфильтровать эти нулевые значения?Я пытался передать аргумент фильтра на ArrayAgg, но это не сработало.Вот упрощенный пример моей установки:

class Image(models.Model):
    # ...

class Reporter(models.Model):
    # ...

class Article(models.Model):
    reporter = models.ForeignKey(Reporter, related_name='reporters')
    featured_image = models.ForeignKey(Image, related_name='featured_images')
    # ...

Тогда, если я сделаю этот запрос:

reporter = Reporter.objects.annotate(
    article_images=ArrayAgg('articles__featured_image'),
    distinct=True
).first()

И у первого репортера в наборе результатов нет связанной статьи, яget:

> reporter.article_images
[None]

Я пытался добавить фильтр, но не повезло:

Reporter.objects.annotate(
    article_images=ArrayAgg(
        'articles__featured_image',
        filter=Q(articles__featured_image__isnull=False)
    )
)

1 Ответ

0 голосов
/ 11 марта 2019

Я попробовал ваш синтаксис Q(field__isnull=False), а также ~Q(field=None); у меня оба отлично работают на Django 2.1.7 и PG 11.2: я получаю [] вместо [None].

В оболочке Django вы можете проверить SQL-запрос, сгенерированный Django для вашего набора запросов:

print(str(your_queryset.query))

Соответствующая часть SQL в моем тесте была:

ARRAY_AGG("table"."field_id") 
    FILTER (WHERE "table"."field_id" IS NOT NULL)
    AS "agg"

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

FILTER (WHERE NOT ("table"."field_id" IS NULL))
...