Arvind Kumar
Arvind Kumar

Reputation: 103

how to group model data based on same values in django

I have a model class

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

I want to group the data for the same value of number field. for ex. if data in db is like

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

my query should return

[{"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}]}]

please suggest how to write query for this ??

Upvotes: 1

Views: 510

Answers (1)

GwynBleidD
GwynBleidD

Reputation: 20569

If you want compute it on database level, it can be done only using raw db query. But you can also achieve it in python.

First, get list of all records sorted by number:

PlayerScore.objects.order_by('number')

now, using values to get all objects as dictionary, so we can group them together in more convenient way:

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

Now, using groupby from itertools we can build our result:

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'])
]

Upvotes: 3

Related Questions