Я хочу получить список последней покупки каждого клиента, отсортированного по дате.
Следующий запрос выполняет то, что я хочу, за исключением даты:
(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 и вызывает очень длительное время загрузки страницы, поэтому я пытаюсь исправить это.
В принципе, я хочу что-то вроде qaru.site/info/49693/.... Можно ли выразить его с помощью запросов django вместо написания необработанного SQL?
Фактические модели и методы имеют длину в несколько страниц, но вот набор моделей, необходимых для запроса выше.
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)
В каждом клиенте покупается не более одной покупки. Приобретение - это самый последний заказчик. Он сортируется по последней дате.
Этот запрос сможет извлечь это:
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 для достижения этого результата.