【问题标题】:How to group by events by year and month in django ORM?如何在 django ORM 中按年和月按事件分组?
【发布时间】:2013-07-17 23:53:52
【问题描述】:

我尝试了多种方法,但无法解决。

我有这样的事件模型:

class Event(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()
    location = models.CharField(max_length=250)

我想按年和月对事件进行分组:

2013

一月

  1. 事件 1
  2. 事件 2

二月

  1. 事件 1
  2. 事件 2

2014

一月

  1. 事件 1
  2. 事件 2

我只在进行排序时使用 start_date。

最后我认为这会起作用,但它没有:

Event.objects.values_list('start_date__year').annotate(dcount=Count('start_date__year'))

【问题讨论】:

  • 回答了您的问题。我希望这足以解决您的问题。

标签: django postgresql orm django-models


【解决方案1】:

查询完数据后就可以使用python的groupby()函数了。

这是一个例子。而不是 date() 您将使用月份。 Django - Group By with Date part alone

【讨论】:

    【解决方案2】:

    我可以向您展示如何将它们分别分组。 会这样做,但请注意,我对 django 的了解并不是世界上最好的。

    Event.objects.filter(end_date__year=2013)
    

    这样你就可以得到 2013 年的所有事件。

    您可以进一步过滤它们以获得月份。

    Event.objects.filter(end_date__year=2013).filter(end_date__month='01')
    

    这将为您提供二月份的所有日期。您可以简单地使用 ModelManager 来管理这些自定义查询,因为您会经常使用它们,然后您可以在视图中调用它们。

    您可以像这样创建ModelManager

    class EventManager(models.Manager):
    
        def get_by_year(self, year):
            Event.objects.filter(date__year=year)
    

    您可以简单地通过Event.objects.get_by_year(2013) 调用它。您可以在更改 Model 中的 objects 属性后执行此操作,如下所示:

    class Event(models.Model):
        start_date = models.DateTimeField()
        end_date = models.DateTimeField()
        location = models.CharField(max_length=250)
        objects = EventManager
    

    【讨论】:

    • 啊,谢谢。嗯,我知道这一点。它变得有点混乱,并且变得很长。就像,我将不得不在几个月内都这样做。可能是最后的手段。
    • @neokya:实际上不会,只需将其抽象到 ModelManager 中即可,这样会容易得多。
    • 我实际上希望在单个查询本身中进行分组输出。看起来这不是很理想的事情。我将查询然后按年和月分组。我认为上面的答案是进入 django 的方法。所以,我接受了。
    • 另外,请将 Event.objects.filter 改为 self.get_query_set()
    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2017-03-02
    • 2012-12-10
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多