假设我有类似这些模型的东西:
class Product(models.Model):
name = models.CharField(max_length=50)
class Sale(models.Model):
product = models.ForeignKey(Product)
sale_date = models.DateField()
我希望每个产品的最新销售 。最新意味着最新的sale_date。此外,在同一查询中,我想获得每种产品的销售产品数量。
在SQL术语中,我需要按product_id进行分组,以计算每个产品的销售数量(每个组的长度)。也许还可以按日期(在每个组中)订购,以获得最新的产品销售。
使用django ORM我意识到我需要以某种方式使用annotate()
并且可能与values()
结合使用。但我仍然没有想到如何。
假设我有产品表:
| id | name |
===================
| 1 | Book |
| 2 | Telephone |
此销售表:
| id | product_id | sale_date |
=================================
| 1 | 1 | 05-02-2015 |
| 2 | 2 | 04-02-2015 |
| 3 | 2 | 03-02-2015 |
| 4 | 1 | 06-02-2015 |
| 5 | 1 | 01-02-2015 |
我希望输出如下:
| product_id | name | sale_date | num_sales |
====================================================
| 1 | Book | 06-02-2015 | 3 |
| 2 | Telephone | 04-02-2015 | 2 |
2015年6月6日是product_id = 1(Book)的最新销售日期,04-02-2015是product_id = 2(电话)的最新日期。
答案 0 :(得分:1)
from django.db.models import Count, Max
query = Product.objects.annotate(num_sales=Count('sale'))
query = query.annotate(latest_sale_date=Max('sale__sale_date'))
for prod in query.all():
print (prod.pk, prod.name, prod.latest_sale_date, prod.num_sales)
您将获得如下输出:
(1, u'Book', datetime.date(2015, 6, 2), 3)
(2, u'Telephone', datetime.date(2015, 4, 2), 2)
类似于问题中的预期输出。请注意,无论您传递给annotate的kwarg都成为查询结果的属性。