我想获取每个客户的最新购买列表,按日期排序。
除了日期之外,以下查询执行我想要的操作:
(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。是否可以用 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 来实现此结果的方法。