如何查询Django中2个字段的出现次数?

时间:2018-08-09 05:05:16

标签: django django-models

我有一个这样的PlayTrack模型,每次user播放track时,这意味着PlayTrack中有1条记录

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

那么,如何查询每个用户的播放次数?

我尝试过PlayTrack.objects.annotate(Count('user'), Count('track')).values('user', 'track__count'),但它给了我类似

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

我需要的是类似的东西

{'user': 2, 'track__count': 3},{'user': 3, 'track__count': 5},{'user': 4, 'track__count': 10},

1 个答案:

答案 0 :(得分:2)

尝试一下,

from django.db.models import Count

PlayTrack.objects.values('user').annotate(count=Count('id'))


这类似于 SELECT user,COUNT(id) from PlayTrack GROUP BY user SQL查询。通过此查询,您将获得所有按用户分组的PlayTrack信息

------------------------------------------ -------------------------------------------------- -----------------------------------------
我有第二个想法,track__count正在计算track的数量。因此,我假设您需要将结果获取为 SELECT user,COUNT(track) from PlayTrack GROUP BY user ,这可能是

from django.db.models import Count

PlayTrack.objects.values('user').annotate(count=Count('track'))