Python Django group by和count
我正在尝试对我的模型执行如下分组:Python Django group by和count,python,django,Python,Django,我正在尝试对我的模型执行如下分组: class Restaurant(models.Model): pass class Order(models.Model): created = models.DateTimeField(auto_now_add=True) restaurant = models.ForeignKey('Restaurant') orders_by_date = {} for order in orders: if orders_by_d
class Restaurant(models.Model):
pass
class Order(models.Model):
created = models.DateTimeField(auto_now_add=True)
restaurant = models.ForeignKey('Restaurant')
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
现在我想知道每天创建了多少订单。这意味着我需要从DateTime字段中获取日期,然后获取计数
如果相关,我将通过以下方式获得Order
queryset:
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中通过以下方式实现:
class Restaurant(models.Model):
pass
class Order(models.Model):
created = models.DateTimeField(auto_now_add=True)
restaurant = models.ForeignKey('Restaurant')
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\uu count':3}
。现在,最好按所有日期分组,而不仅仅是按单个日期分组。您应该能够执行订单.filter(created_udate=datetime.date(2018,6,8)).values('id_ucount')
,这将为您提供一个字典列表:[{id_ucount:3},{id_ucount:1},
这是你的电话号码
编辑: 尝试注释,然后获取值:
orders_with_counts = orders.annotate(Count('id'))
dates_and_counts = orders_with_counts.values_list('created__date','id__count')
dct = dict(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
,例如:
<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)...']>
(其中123
是一个示例餐厅id)
例如,您可以迭代结果并构造一个JSON对象,等等
例如,我们可以将其转换为一个字典,通过字典理解迭代查询,将datetime.date
对象映射到计数:
请注意,没有任何顺序
的日期将不会是查询集的一部分(也不会是结果
字典的一部分,这是合乎逻辑的,因为我们将顺序
表作为“根”,如果没有行,则将不会有输出)它给了我{FieldError}无法将关键字“count”解析到字段中。不允许在“id”上加入。
但仍然不能解决分组问题。如果可能的话,我想在数据库上做,而不是在python中。对不起,误解了这一部分。您希望通过按日期分组得到什么结果?正如我所说的,我想要成对的日期计数。因此,如果我有一个订单是在2018年1月1日12:00创建的,第二个订单是在2018年1月1日13:00创建的,第三个订单是在2018年1月2日12:00创建的,我希望输出类似于{date(2018,1,1):2,date(2018,1,2):1}
当你说“按所有日期分组”时,你的意思是为每个日期获取id\u计数吗?或多或少是的。确切地说:如果我有一个订单是在2018年1月1日12:00创建的,第二个订单是在2018年1月1日13:00创建的,第三个订单是在2018年1月2日12:00创建的,我希望输出类似于{date(2018,1,1):2,date(2018,1,2):1}
。如果是{id\u count':2,'created\u date':date(2018,1,1),(…)
我就可以了。好的,我编辑了我的答案。这解决了我的问题。如果有人对创建的查询感兴趣,我就把它粘贴到这里:在[57]:print(x.query)选择“papu\u order”。“created”::日期为“create\u date”,count(“papu order”。“id”)为“id\u count”从“papu_订单”,其中“papu_订单”。“餐厅id”=1组由“papu_订单”。“创建”::日期订单由“创建日期”ASC