【问题标题】:Django model group by datetime's date按日期时间的日期的 Django 模型组
【发布时间】:2010-08-02 14:12:43
【问题描述】:

假设我有一个这样的模型:

class Entity(models.Model):
    start_time = models.DateTimeField()

我想将它们重新组合为列表列表,其中每个列表列表都包含来自同一日期(同一天,时间应忽略)的实体。

如何以 Python 的方式实现这一点?

谢谢

【问题讨论】:

标签: python django django-models


【解决方案1】:

创建一个只提取日期的小函数:

def extract_date(entity):
    'extracts the starting date from an entity'
    return entity.start_time.date()

那么你就可以和itertools.groupby一起使用了:

from itertools import groupby

entities = Entity.objects.order_by('start_time')
for start_date, group in groupby(entities, key=extract_date):
    do_something_with(start_date, list(group))

或者,如果你真的想要一个列表列表:

entities = Entity.objects.order_by('start_time')
list_of_lists = [list(g) for t, g in groupby(entities, key=extract_date)]

【讨论】:

  • 除非我遗漏了什么,否则它将按日期时间分组,而 OP 只想按日期分组。您可能对这篇文章感兴趣:stackoverflow.com/questions/1236865/grouping-dates-in-django
  • @Jordan Reiter:问题已被编辑。我已经编辑了答案,现在它可以按照 OP 的要求工作。
【解决方案2】:

我同意这个答案:

Product.objects.extra(select={'day': 'date( date_created )'}).values('day') \
               .annotate(available=Count('date_created'))

但还有一点是: date() 的参数不能使用双下划线组合 foreign_key 字段, 你必须使用 table_name.field_name

result = Product.objects.extra(select={'day': 'date( product.date_created )'}).values('day') \
           .annotate(available=Count('date_created'))

product 是表名

另外,您可以使用“print result.query”在 CMD 中查看 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2017-10-07
    • 2020-09-09
    相关资源
    最近更新 更多