【问题标题】:Django Max DateTime AggregationDjango Max DateTime 聚合
【发布时间】: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,但我不确定如何解决。任何见解将不胜感激。

【问题讨论】:

    标签: python django datetime aggregation


    【解决方案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 的一个错误。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 2013-07-24
      • 2010-12-20
      • 2021-02-03
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多