Django group by and Count公司

2024-04-23 14:30:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

class Restaurant(models.Model):
    pass

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

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

如果它是相关的,我将通过以下方式获得Orderqueryset:

^{pr2}$

现在,我怎样才能从orders得到我想要的?我尝试过类似的方法:

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

使用TruncDate等。在

我使用的是python2和django1.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}。现在最好是按所有日期分组,而不仅仅是这个日期。在


Tags: iddatetimedatebymodelmodelscountyear
2条回答

您应该能够执行orders.filter(created__date=datetime.date(2018, 6, 8)).values('id__count'),这将为您提供一个字典列表:[{'id__count': 3},{'id__count': 1},...]。在

这是docs


编辑: 尝试注释,然后获取值:

orders_with_counts = orders.annotate(Count('id'))
dates_and_counts = orders_with_counts.values_list('created__date','id__count')
dct = dict(dates_and_counts)

dates_and_counts将是元组的列表:[(date1,count1),(date2,count2)...]dct将转换为字典。在

您可以使用以下方法在一个查询中获取数据:

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的字典,例如:

^{pr2}$

(添加格式)

在幕后,它将生成一个查询,如:

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对象,等等

例如,我们可以通过使用dictionary comprehension迭代查询,将datetime.date对象映射到counts:

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

注意,没有任何Order的日期将不属于查询集(也不属于result字典,这是合乎逻辑的,因为我们将Order表作为“根”,如果没有行,则没有输出)

相关问题 更多 >