在电子商店应用程序中,我有一个存储订单处理历史的模型:
class OrderStatusHistory(models.Model):
order = models.ForeignKey(Order, related_name='status_history')
status = models.IntegerField()
date = models.DateTimeField(auto_now_add=True)
现在我想获得每个订单的最新状态。在纯SQL中,我可以在一个查询中执行此操作:
select * from order_orderstatushistory where (order_id, date) in (select order_id, max(date) from order_orderstatushistory group by order_id)
在Django中这样做的最佳方式是什么?
我有两个选择。第一个是:
# Get the most recent status change date for each order
v = Order.objects.annotate(Max('status_history__date')).values_list('id', 'status_history__date__max')
# Get OrderStatusHistory objects
hist = OrderStatusHistory.objects.extra(where=['(order_id, date) IN %s'], params=[tuple(v)])
第二个:
hist = OrderStatusHistory.objects.extra(where=['(order_id, date) IN (select order_id, max(date) from order_orderstatushistory group by order_id)'])
第一个选项是纯Django,但会导致2个数据库查询和从Django传递到数据库引擎的大量参数列表。
第二个选项需要将SQL代码直接放入我的应用程序中,但我想避免这种情况。
在Django中是否等同于where (order_id, date) in (select ...)
?
答案 0 :(得分:0)
您是否尝试过使用此查询
OrderStatusHistory.objects.order_by('order', '-date').distinct('order')