在电子商店应用程序中,我有一个用于存储订单处理历史的模型:
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 代码直接放入我的应用程序中,但我想避免这种情况。
where (order_id, date) in (select ...)
在 Django 中是否有等价物?