日付順に並べ替えられた、各顧客の最新の購入のリストを取得したいと考えています。
次のクエリは、日付を除いて私が望むことを行います:
(Purchase.objects
.all()
.distinct('customer')
.order_by('customer', '-date'))
次のようなクエリが生成されます。
SELECT DISTINCT ON
"shop_purchase.customer_id"
"shop_purchase.id"
"shop_purchase.date"
FROM "shop_purchase"
ORDER BY "shop_purchase.customer_id" ASC,
"shop_purchase.date" DESC;
customer_id
という理由で、最初のORDER BY
式として使用せざるを得ませんDISTINCT ON
。
日付で並べ替えたいので、本当に必要なクエリは次のようになります。
SELECT * FROM (
SELECT DISTINCT ON
"shop_purchase.customer_id"
"shop_purchase.id"
"shop_purchase.date"
FROM "shop_purchase"
ORDER BY "shop_purchase.customer_id" ASC,
"shop_purchase.date" DESC;
)
AS result
ORDER BY date DESC;
クエリをページ制限する必要があるため、Pythonを使用して並べ替えたくありません。データベースには何万行もある可能性があります。
実際、現在Pythonでソートされており、ページの読み込み時間が非常に長くなっているため、これを修正しようとしています.
基本的に、このhttps://stackoverflow.com/a/9796104/242969のようなものが欲しいです。生のSQLを書く代わりに、djangoクエリセットで表現することは可能ですか?
実際のモデルとメソッドは数ページの長さですが、上記のクエリセットに必要なモデルのセットは次のとおりです。
class Customer(models.Model):
user = models.OneToOneField(User)
class Purchase(models.Model):
customer = models.ForeignKey(Customer)
date = models.DateField(auto_now_add=True)
item = models.CharField(max_length=255)
次のようなデータがある場合:
Customer A -
Purchase(item=Chair, date=January),
Purchase(item=Table, date=February)
Customer B -
Purchase(item=Speakers, date=January),
Purchase(item=Monitor, date=May)
Customer C -
Purchase(item=Laptop, date=March),
Purchase(item=Printer, date=April)
以下を抽出できるようにしたい:
Purchase(item=Monitor, date=May)
Purchase(item=Printer, date=April)
Purchase(item=Table, date=February)
リスト内の購入は、顧客ごとに最大 1 つです。購入は各顧客の最新のものです。最新の日付順にソートされます。
このクエリは、次のものを抽出できます。
SELECT * FROM (
SELECT DISTINCT ON
"shop_purchase.customer_id"
"shop_purchase.id"
"shop_purchase.date"
FROM "shop_purchase"
ORDER BY "shop_purchase.customer_id" ASC,
"shop_purchase.date" DESC;
)
AS result
ORDER BY date DESC;
この結果を得るために生の SQL を使用する必要がない方法を見つけようとしています。