1

在电子商店应用程序中,我有一个用于存储订单处理历史的模型:

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 中是否有等价物?

4

1 回答 1

0

您是否尝试过使用此查询

OrderStatusHistory.objects.order_by('order', '-date').distinct('order')
于 2012-09-21T08:15:03.560 回答