e ショップ アプリケーションには、注文処理の履歴を保存するためのモデルがあります。
class OrderStatusHistory(models.Model):
order = models.ForeignKey(Order, related_name='status_history')
status = models.IntegerField()
date = models.DateTimeField(auto_now_add=True)
ここで、各注文の最新のステータスを取得したいと考えています。純粋な SQL では、これを 1 つのクエリで実行できます。
select * from order_orderstatushistory where (order_id, date) in (select order_id, max(date) from order_orderstatushistory group by order_id)
Djangoでこれを行う最良の方法は何ですか?
選択肢は 2 つあります。1 つ目は次のとおりです。
# 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)])
そして2番目:
hist = OrderStatusHistory.objects.extra(where=['(order_id, date) IN (select order_id, max(date) from order_orderstatushistory group by order_id)'])
最初のオプションは純粋な Django ですが、2 つのデータベース クエリと、Django からデータベース エンジンに渡されるパラメーターの大きなリストが発生します。
2 番目のオプションでは、SQL コードをアプリケーションに直接配置する必要がありますが、これは避けたいと思います。
where (order_id, date) in (select ...)
Djangoに相当するものはありますか?