Django DRF-按日期分组

时间:2019-05-28 12:16:26

标签: django django-rest-framework

我需要按日期在DRF上对查询集的结果进行分组

    """ Django model """
    class Matches(models.Model):
        name = models.CharField(max_length=100)
        platform = models.CharField(max_length=100)
        mode = models.CharField(max_length=100)
        kills = models.IntegerField()
        date = models.DateTimeField()

    """ Serializer """
    class MatchesSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Matches
            fields = ('name', 'platform', 'mode', 'kills', 'date')
    """ views """
    class Matches(generics.ListAPIView):
        serializer_class = serializers.MatchesSerializer
        filter_backends = (filters.OrderingFilter,)
        lookup_field = 'name'
        ordering = ('-date',)
        def get_queryset(self):
            username = self.kwargs['name']
            return models.Matches.objects.filter(name=username)

所需的输出(仅作为示例):

[
   {
      'date':'2019-01-01',
      'data':[
         {
            'platform':'ps4',
            'mode':'solo',
            'kills':10,
            'date':'2019-01-01 10:00:00'
         },
         {
            'platform':'ps4',
            'mode':'duo',
            'kills':10,
            'date':'2019-01-01 12:00:00'
         },
         {
            'platform':'ps4',
            'mode':'squad',
            'kills':10,
            'date':'2019-01-01 11:00:00'
         },

      ]
   },
   {
      'date':'2019-01-02',
      'data':[
         {
            'platform':'ps4',
            'mode':'solo',
            'kills':1,
            'date':'2019-01-02 10:00:00'
         },
         {
            'platform':'ps4',
            'mode':'duo',
            'kills':2,
            'date':'2019-01-02 12:00:00'
         },
         {
            'platform':'ps4',
            'mode':'squad',
            'kills':3,
            'date':'2019-01-02 11:00:00'
         },

      ]
   }
]

对我来说,简单的解决方案是在django上创建原始查询并创建序列化程序,但是感觉不像pythonic ...

所以看来DRF有一些漂亮的方法可以使它看起来不错,也许使用to_representation ...

2 个答案:

答案 0 :(得分:1)

我使用了itertools.groupby迭代器。在下面检查我的代码。

from itertools import groupby

events = [["2020-04-01", "A"], ["2020-04-01", "B"], ["2020-04-02", "C"], ["2020-04-02", "D"]]

for k, g in groupby(events, lambda x: x[0]):
list = []
    for group in g:
        list.append(group[1])
    output[k] = list

输出将按日期分组,如下所示:

{'2020-04-01': ['A', 'B'], '2020-04-02': ['C', 'D']}

请先确保按日期订购。

答案 1 :(得分:0)

您可以使用Django ORM中的raw函数

results = Matches.objects.raw('SELECT * FROM myapp_matches GROUP BY date')