如何在 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>)
)
我正在使用 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>)
)