gpt4 book ai didi

python - Django 分组和计数

转载 作者:行者123 更新时间:2023-11-28 18:10:59 27 4
gpt4 key购买 nike

我正在尝试对我的模型进行分组,如下所示:

class Restaurant(models.Model):
pass

class Order(models.Model):
created = models.DateTimeField(auto_now_add=True)
restaurant = models.ForeignKey('Restaurant')

现在我想知道每天创建了多少订单。这意味着我需要从 DateTime 字段中获取日期,然后进行计数。

如果相关,我将以这种方式获取 Order 查询集:

restaurant = Restaurant.objects.get(id=request.data['restaurant_id'])
orders = restaurant.order_set.filter(created__lte=some_date)

现在,我怎样才能从订单中得到我想要的东西?我尝试过类似的事情:

orders.values('created').annotate(Count('created'))

使用 TruncDate 等。

我正在使用 Python 2 和 Django 1.11。

编辑 为了更好地表达我的意图。我想要一些我会在纯 python 中实现的东西,就像这样:

orders_by_date = {}
for order in orders:
if orders_by_date.get(datetime.date(orders[0].created.year, orders[0].created.month, orders[0].created.day):
orders_by_date[datetime.date(orders[0].created.year, orders[0].created.month, orders[0].created.day)] += 1
else:
orders_by_date[datetime.date(orders[0].created.year, orders[0].created.month, orders[0].created.day)] = 1

EDIT2 我能够成功显示单个日期的计数:

orders.filter(created__date=datetime.date(2018, 6, 8)).aggregate(Count('id'))

给我 {'id__count': 3}。现在按所有日期分组将是完美的,而不仅仅是这个日期。

最佳答案

您可以通过以下方式在一个查询中获取数据:

from django.db.models import DateField, Sum
from django.db.models.functions import Cast

query = Order.objects.filter(
restaurant=some_restaurant
).annotate(
create_date=Cast('created', DateField())
).values('create_date').annotate(
id_count=Count('id')
).order_by('create_date')

这将返回字典的 QuerySet,例如:

<QuerySet [{'create_date': datetime.date(2017, 1, 31), 'id_count': 14}, 
{'create_date': datetime.date(2017, 2, 2), 'id_count': 25},
{'create_date': datetime.date(2017, 2, 9), 'id_count': 13},
{'create_date': datetime.date(2017, 2, 10), 'id_count': 2},
{'create_date': datetime.date(2017, 2, 16), 'id_count': 17},
{'create_date': datetime.date(2017, 2, 17), 'id_count': 89},
{'create_date': datetime.date(2017, 2, 20), 'id_count': 20},
{'create_date': datetime.date(2017, 2, 23), 'id_count': 18},
{'create_date': datetime.date(2017, 2, 24), 'id_count': 20},
{'create_date': datetime.date(2017, 2, 28), 'id_count': 20},
{'create_date': datetime.date(2017, 3, 1), 'id_count': 3},
{'create_date': datetime.date(2017, 3, 3), 'id_count': 9},
{'create_date': datetime.date(2017, 3, 7), 'id_count': 9},
{'create_date': datetime.date(2017, 3, 9), 'id_count': 1},
{'create_date': datetime.date(2017, 3, 10), 'id_count': 7},
{'create_date': datetime.date(2017, 3, 14), 'id_count': 2},
{'create_date': datetime.date(2017, 3, 15), 'id_count': 7},
{'create_date': datetime.date(2017, 3, 17), 'id_count': 9},
{'create_date': datetime.date(2017, 3, 22), 'id_count': 2},
{'create_date': datetime.date(2017, 3, 24), 'id_count': 8},
'...
(remaining elements truncated)...']>

(添加格式)

在幕后,它会生成如下查询:

SELECT CAST(`order`.`created` AS date) AS `create_date`,
COUNT(`order`.`id`) AS `id_count`
FROM `order`
WHERE `order`.`restaurant_id` = 123
GROUP BY CAST(`order`.`created` AS date)
ORDER BY `create_date` ASC

(此处 123 是示例餐厅 ID)。

因此您随后可以迭代结果并构造一个 JSON 对象等。

例如,我们可以通过使用字典理解遍历查询,将其翻译成字典,将 datetime.date 对象映射到计数:

result = { t['create_date']: t['id_count'] for t in query }

请注意,没有任何 Order 的日期不会成为查询集的一部分(也不会成为 result 字典的一部分,这是合乎逻辑的,因为我们采用了 Order 表为“根”,如果没有行,则没有输出)

关于python - Django 分组和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763627/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com