如何查询指定external_id且timestamp最高的Transaction对象并解决aggregate报错
错误原因
QuerySet.aggregate() 方法仅接受聚合函数表达式作为入参,你直接将筛选条件传入了aggregate(),不属于可识别的聚合表达式,因此抛出类型错误。筛选逻辑需要前置到filter()方法中执行。
实现方案
方案1:仅需要获取符合条件的最高timestamp值
先过滤external_id=1的数据集,再做聚合查询:
highest_timestamp = Transaction.objects.filter(external_id=1).aggregate(highest_timestamp=Max('timestamp'))["highest_timestamp"]
方案2:需要获取完整的最高timestamp对应的Transaction对象
更高效的写法是过滤后按timestamp倒序排序,取第一条即可:
# 拿到符合条件的、timestamp最大的单条交易对象 max_transaction = Transaction.objects.filter(external_id=1).order_by("-timestamp").first()
如果存在多条记录timestamp同为最大值的场景,可以先查最大时间再匹配查询:
# 先查询最大时间戳 max_ts = Transaction.objects.filter(external_id=1).aggregate(max_ts=Max("timestamp"))["max_ts"] # 拿到所有符合条件、时间戳等于最大值的交易对象列表 max_transaction_list = Transaction.objects.filter(external_id=1, timestamp=max_ts)
内容的提问来源于stack exchange,提问作者Anjayluh
相关产品推荐
相关产品推荐

