【问题标题】:how to group model data based on same values in django如何在 django 中根据相同的值对模型数据进行分组
【发布时间】:2015-12-25 19:27:12
【问题描述】:

我有一个模型类

class PlayerScore(models.Model):
    number=models.IntegerField()
    points=models.FloatField(default=0)
    player=models.ForeignKey('Player')

我想对 number 字段的相同值的数据进行分组。 例如。如果 db 中的数据是这样的

number | points | player_id
-------+--------+----------
     1 |     45 |         1 
     1 |     68 |         2
     2 |     79 |         3
     2 |     70 |         4

我的查询应该返回

[{"number":1, "records": [{"points":45,"player_id":1},{"points":68,"player_id":2}]},
 {"number":2, "records" :[{"points":79,"player_id":3},{"points":70,"player_id":4}]}]

请建议如何为此编写查询??

【问题讨论】:

    标签: django python-3.x django-models


    【解决方案1】:

    如果你想在数据库级别计算它,它只能使用原始数据库查询来完成。但是你也可以在python中实现。

    首先,获取按number排序的所有记录列表:

    PlayerScore.objects.order_by('number')
    

    现在,使用values 将所有对象作为字典获取,这样我们就可以更方便地将它们组合在一起:

    PlayerScore.objects.order_by('number').values() # or you can list only relevant fields inside values
    

    现在,我们可以使用 itertools 中的 groupby 构建结果:

    from itertools import groupby
    
    values = [
        {'number': k, 'records': list(g)} for k, g in # we are converting iterator returned from groupby into desired list of dictionaries
        groupby(PlayerScore.objects.order_by('number').values(), lambda x: x['number'])
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多