Reputation: 103
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
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