10

我正在使用 Django 的 postgres 特定的ArrayAgg聚合器。它工作正常,但是当列表为空时,我得到[None]的不是[]. 有没有办法过滤掉这些空值?我试图将过滤器参数传递给ArrayAgg但它没有用。这是我的设置的简化示例:

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

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

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

然后,如果我进行此查询:

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

结果集中的第一个记者没有任何相关文章,我得到:

> reporter.article_images
[None]

我试图添加一个过滤器,但没有运气:

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

1 回答 1

4

我试过你的语法Q(field__isnull=False),也试过~Q(field=None);在 Django 2.1.7 和 PG 11.2 上都可以正常工作:我得到[]的不是[None].

在 Django shell 中,您可以检查 Django 为您的查询集生成的 SQL 查询:

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))
于 2019-03-11T17:34:08.807 回答