Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django group by和count_Python_Django - Fatal编程技术网

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