1

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に相当するものはありますか?

4

1 に答える 1

0

このクエリを使用してみましたか

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