Как группировать по дате в наборе запросов - PullRequest
0 голосов
/ 09 июля 2020

Мне нужна помощь в написании правильного набора запросов в Django View. У меня модель Post с полем created_at (datetime). Я хочу сгруппировать его по дате и вернуть в заданном формате c.

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}]>

1 Ответ

0 голосов
/ 09 июля 2020

Это вспомогательная функция, вы можете sh добиться таких результатов, это может быть лучшим решением. Это тот, который я придумал

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

. Вы можете переопределить функцию get вашего API и переделать вывод

и переопределить return Response(group_by_date(serializer.data), HTTP_200_OK)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...