Django Max DateTime 聚合

Posted

技术标签:

【中文标题】Django Max DateTime 聚合【英文标题】:Django Max DateTime Aggregation 【发布时间】:2020-06-17 13:49:16 【问题描述】:

获取 Django 实例相关对象的相关对象的最大日期时间的最佳方法是什么?我需要这个值作为实例属性。

例如,对于这些模型,

class Show(Model):
    is_live = BooleanField()
    ...

class Season(Model):
    show = ForeignKeyField(Show, on_delete=CASCADE, related_name='seasons')
    is_live = BooleanField()
    ...

class Episode(Model):
    season = ForeignKeyField(Season, on_delete=CASCADE, related_name='episodes')
    is_live = BooleanField()
    live_date = DateTimeField(blank=True, null=True)
    ...

如何获取节目实例的最新剧集live_date,仅包括剧集 is_live == True 和剧集 is_live == True 的剧集?

我已经在Show 模型中尝试过这个:

@property
def max_episode_live_date(self)
    return self.seasons.filter(
        is_live=True
     ).aggregate(
        max_=Max(
            'episodes__live_date',
            filter=Q(episodes__is_live=True)
        )
    ).get('max_')

但我收到此错误 AttributeError: 'str' 对象没有属性 'tzinfo'

我尝试过使用Django SubQuery expressions,

@property
def max_episode_live_date(self)
    episodes = Episode.objects.filter(
        is_live=True,
        season=OuterRef('pk')
    ).values('live_date')

    return self.seasons.filter(
        is_live=True
    ).aggregate(
        max_=Max(Subquery(episodes))
    ).get('max_')

然后我得到 django.db.utils.OperationalError: (1242, '子查询返回超过 1 行')

我相信这是由于某些剧集包含 null live_date,但我不确定如何解决。任何见解将不胜感激。

【问题讨论】:

【参考方案1】:
@property
def max_episode_live_date(self)
    return self.seasons.filter(
        is_live=True
     ).aggregate(
        max_=Max(
            'episodes__live_date',
            filter=Q(episodes__is_live=True)
        )
    ).get('max_')

SQL

"SELECT MAX(CASE WHEN `episode`.`is_live` is true THEN `episode`.`live_date` ELSE NULL END) AS `max_`" 

将被执行。结果将是一个字符串或无。当字符串转换为带时区的 DateTime 时,会发生错误。 我认为这可能是 Django 的一个错误。

【讨论】:

以上是关于Django Max DateTime 聚合的主要内容,如果未能解决你的问题,请参考以下文章

Django学习路17_聚合函数(Avg平均值,Count数量,Max最大,Min最小,Sum求和)基本使用

Django学习路17_聚合函数(Avg平均值,Count数量,Max最大,Min最小,Sum求和)基本使用

在 Django 中聚合分组字段时返回对象

Django 使用表达式聚合查询

Django 06

django-聚合查询