Ari*_*iel 8 django postgresql django-aggregation django-postgresql django-annotate
我正在使用 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')
# ...
Run Code Online (Sandbox Code Playgroud)
然后,如果我进行此查询:
reporter = Reporter.objects.annotate(
article_images=ArrayAgg('articles__featured_image'),
distinct=True
).first()
Run Code Online (Sandbox Code Playgroud)
结果集中的第一个记者没有任何相关文章,我得到:
> reporter.article_images
[None]
Run Code Online (Sandbox Code Playgroud)
我试图添加一个过滤器,但没有运气:
Reporter.objects.annotate(
article_images=ArrayAgg(
'articles__featured_image',
filter=Q(articles__featured_image__isnull=False)
)
)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过你的语法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"
Run Code Online (Sandbox Code Playgroud)
根据所使用的语法变体,您还可以获得以下内容,但其结果是相同的:
FILTER (WHERE NOT ("table"."field_id" IS NULL))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3273 次 |
最近记录: |