如何按照年份和月份在django ORM中按事件分组?

时间:2013-07-18 20:42:00

标签: django postgresql orm django-models

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

我有这样的事件模型:

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

我希望按年份分组事件,然后按月分组:

2013

  1. 活动1
  2. 活动2
  3. 二月

    1. 活动1
    2. 活动2
    3. 2014

      1. 活动1
      2. 活动2
      3. 我在进行排序时只接受start_date。

        最后我认为这会有效,但事实并非如此:

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

2 个答案:

答案 0 :(得分:2)

我可以告诉你如何分别对它们进行分组。这就是 I 的意思,但请注意我对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)来调用它。您可以在更改objects中的Model媒体资源后执行此操作,如下所示:

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

答案 1 :(得分:1)

在查询数据后,您可以使用python的groupby()函数。

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