Reputation: 439
I've got a PlayTrack model like this, each time a user
plays a track
, it means 1 record in PlayTrack
class PlayTrack(models.Model):
track = models.ForeignKey(Track, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)
token = models.CharField(max_length=255, default='default_token')
So, how do I query the play count of each user ?
I've tried PlayTrack.objects.annotate(Count('user'), Count('track')).values('user', 'track__count')
, but it gives me something like
<QuerySet [{'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, {'user': 2, 'track__count': 1}, '...(remaining elements truncated)...']>
What I need is something like
{'user': 2, 'track__count': 3},{'user': 3, 'track__count': 5},{'user': 4, 'track__count': 10},
Upvotes: 1
Views: 35
Reputation: 88499
Try this,
from django.db.models import Count
PlayTrack.objects.values('user').annotate(count=Count('id'))
This is similar to SELECT user,COUNT(id) from PlayTrack GROUP BY user
SQL query.By this query you'll get all PlayTrack information grouped by user
-------------------------------------------------------------------------------------------------------------------------------------
I have a second thought, track__count
is taking the count of track
. So I assume you need to get the result as SELECT user,COUNT(track) from PlayTrack GROUP BY user
, which could possible by,
from django.db.models import Count
PlayTrack.objects.values('user').annotate(count=Count('track'))
Upvotes: 2