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求和)基本使用