QuerySet的where子句中的多个字段

时间:2012-09-15 14:37:06

标签: django django-queryset

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

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 ...)

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用此查询

OrderStatusHistory.objects.order_by('order', '-date').distinct('order')