首页 > 解决方案 > 如何在查询集中按日期分组

问题描述

我需要帮助在 Django View 中编写正确的查询集。我有(字段)的Post模型。我想按日期分组并以特定格式返回。created_atdatetime

models.py

class Post(TrackableDate):
    title = models.CharField(max_length=255)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

views.py

class PostViewSet(mixins.ListModelMixin,
                  viewsets.GenericViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer

serializers.py

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = '__all__'

通常的响应如下所示:

[
  {
    "id": 1,
    "text": "ok",
    "created_at": "2012-12-12T12:30:00"
  },
  {
    "id": 2,
    "text": "ok",
    "created_at": "2012-12-12T12:30:00"
  },
  {
    "id": 3,
    "text": "ok",
    "created_at": "2012-12-13T12:30:00"
  }
]

如何分组和返回?

{
  "2012-12-12": [
    {
      "id": 1,
      "text": "ok",
      "created_at": "2012-12-12T12:30:00"
    },
    {
      "id": 2,
      "text": "ok",
      "created_at": "2012-12-12T12:30:00"
    }
  ],
  "2012-12-13": [
    {
      "id": 3,
      "text": "ok",
      "created_at": "2012-12-13T12:30:00"
    }
  ]
}

我试着做

Post.objects.extra(select={'created_at': 'date(created_at)'}).values('created_at').annotate(available=Count('created_at'))

但它返回

<QuerySet [{'created_at': '2020-07-04', 'available': 7}, {'created_at': '2020-07-09', 'available': 2}]>

标签: jsondjango

解决方案


这是一个辅助函数,你可以像这样完成你的结果,它可能是一个更好的解决方案。这是我想出的

def group_by_date(mydata):
     new_data = {}
     for element in mydata:
         v = element['created_at'].split('T')[0]
             if v not in new_data.keys():
                 new_data[v] = []
         new_data[v].append(element)
     return new_data

您可以覆盖 API 的 get 函数并重新处理输出

并覆盖return Response(group_by_date(serializer.data), HTTP_200_OK)


推荐阅读