【问题标题】:Django DRF - Group by dateDjango DRF - 按日期分组
【发布时间】:2019-05-28 12:16:26
【问题描述】:

我需要在 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...

【问题讨论】:

  • 你能告诉我们你的views.py吗?它可能在那里您应该更改和注释/聚合您的项目
  • 添加了当前视图类,即只显示匹配列表,不分组
  • 你的答案可能在this post
  • 两个 cmets 似乎都回答了我的问题!你们中的任何人都可以提供答案以便我接受吗?

标签: django django-rest-framework


【解决方案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']}

请先确定您的订单日期。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-05-25
      • 1970-01-01
      • 2012-02-03
      • 2021-11-24
      • 2020-09-09
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      相关资源
      最近更新 更多