如何在 Django 的 ManyToMany 关系中分组?

How to group by in ManyToMany relationships in Django?

我正在使用 Django 创建 Web 应用程序,但在使用其 ORM 进行查询时遇到了一些问题。 我有这些型号:

class Country(models.Model):
name = models.CharField(max_length=25)

class Song(models.Model):
title = models.CharField(max_length = 25)
country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name="songs")
ratings = models.ManyToManyField(Country, through='Rating')

class Rating(models.Model):
rating = models.PositiveSmallIntegerField()
country_id = models.ForeignKey(Country, on_delete=models.SET_NULL, null=True)
song_id = models.ForeignKey(Song, on_delete=models.SET_NULL, null=True)

一个国家给很多歌曲打分(1-10分),一个歌曲可以被很多国家打分,所以这些模型之间通过Ratingtable存在ManyToMany关系。 我正在查询以获取歌曲收到的 10 分的数量,但我不知道如何获得。为此,我尝试了这个查询:

result = Rating.objects.filter(rating=10).values('song_id').annotate(ten_points = Count('rating'))

我阅读了 Django 文档,我了解到 values() 方法类似于 SQL 中的 group by 子句,但它不起作用,因为此查询 returns 字典的查询集如下所示:

<QuerySet [{'song_id': 1, 'ten_points': 1}, {'song_id': 2, 'ten_points': 1}, {'song_id': 2, 'ten_points': 1}, {'song_id': 3, 'ten_points': 1}, {'song_id': 3, 'ten_points': 1} 

为什么我得到的是具有相同键和值 1 的不同字典,而不是键和值为 10 点总数的字典?

需要使用.order_by(…)强制分组,所以:

result = Rating.objects.filter(rating=10).values(
    'song_id'
).annotate(ten_points=Count('rating'))<strong>.order_by('song_id')</strong>

但在这种特定情况下,注释 Song 可能更有意义:

Song.objects.filter(
    <strong>rating__rating=10</strong>
).annotate(
    <strong>ten_points=Count('rating')</strong>
)

这将仅包括 Song 至少有 一个 Rating 记录 rating=10。如果要注释allSong,可以使用:

from django.db.models import Q

Song.objects.annotate(
    <strong>ten_points=Count('rating', filter=Q(rating__rating=10)</strong>)
)