【问题标题】:Django - Query latest date in an ArrayFieldDjango - 查询 ArrayField 中的最新日期
【发布时间】:2017-12-23 23:44:17
【问题描述】:

我正在使用 Django 的 postgres ArrayField

假设我有一个这样的模型:

from django.db import models
from django.contrib.postgres.fields import ArrayField

class Event(models.Model):
    name = models.CharField(max_length=200)
    dates = ArrayField(models.DateField())

我想找到最新日期的Event。有没有办法构建一个可以做到这一点的查询集?

【问题讨论】:

  • 拥有EventDates的代理表不是更好吗?
  • 可能,但目前数据库就是这样,并且其中有大量数据。我希望在进行重大架构更改和数据迁移之前找出是否可以使用 ArrayField 完成。此外,这个特定的表非常难以处理,并且对于大多数与日期相关的查询需要快速(除了这个特定的 max-date 查询 - 它不需要 需要 超级快,因为它不会不经常需要),所以我想避免加入。

标签: django postgresql django-queryset


【解决方案1】:

我无法深入了解 Django 的细节(我对它不是很精通)。但是,一些指针:

  1. 直接使用 SQL 语言,您将使用:

    SELECT
        name, (SELECT max(d) FROM unnest(dates) d) AS latest_date
    FROM
        Event ;
    
  2. 要将其反向转换到 Django,请检查Django Postgresql ArrayField aggregation,并根据您的具体情况调整它。

    我认为下面的代码应该可以解决问题1

    Event.objects.annotate(arr_els=Func(F('dates'), function='unnest')) \
            .values_list('arr_els', flat=True).aggregate(Max('arr_els'))
    

请参阅 dbfiddle here 上的 SQL 示例。

1) 我没有合适的环境来测试 Django 部分...所以,这是未经测试的。

【讨论】:

  • 你真的尝试过代码吗?你必须修改它吗?
  • 是的,我做到了。上面实际上是在Events 中找到最新的日期,而不是最新日期的Event。但这实际上是我最终想要得到的,无论如何。如果我想要Event,只要我知道日期就很容易查询。
猜你喜欢
  • 2022-12-17
  • 2018-07-30
  • 2020-07-04
  • 2014-05-23
  • 2012-10-13
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 2021-06-26
相关资源
最近更新 更多