gpt4 book ai didi

python - 多对多 Django ORM 的分组和求和

转载 作者:太空宇宙 更新时间:2023-11-03 16:43:08 24 4
gpt4 key购买 nike

我有下一个模型的电影租赁店。也就是说,表UserRating存储与用户相关的电影的评分。我正在尝试创建一个 View ,可以获取按评级排序的电影的相应图像。我知道如何按评级排序 (UserRating.objects.values('movie_id').annotate(dcount=Sum('vote')).order_by('dcount'))。我现在的问题是?如何获取我获得的这些 movie_id 的图像?

class Movie(models.Model) :
title = models.CharField(max_length=200, primary_key=True)
movie_image = models.ImageField()

class User(models.Model):
name = models.CharField(max_length=200, primary_key=True)
email = models.CharField(max_length=200)
def __str__(self):
return self.name

def __unicode__(self):
return self.name

class UserRating(models.Model) :
vote = models.IntegerField()
class Meta:
unique_together = (('user', 'movie'),)

movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)

最佳答案

一般来说,在 Django 中,如果你最终想要返回某个模型的数据,你必须通过该模型的对象管理。在本例中,您要从 Movie 中查找字段,因此首先使用 Movie 对象管理器。

为您的 FK 关系构建自动逆关系,可在 ORM 中使用。 ORM 代码最终看起来像这样(我按投票降序排列,因为我假设您首先想要投票最多的电影):

Movie.objects.annotate(votes=Count('userrating')).order_by('-votes').values_list('movie_image', flat=True)

生成的 SQL 是:

SELECT "sample_movie"."movie_image" FROM "sample_movie"
LEFT OUTER JOIN "sample_userrating" ON ("sample_movie"."title" = "sample_userrating"."movie_id")
GROUP BY "sample_movie"."title"
ORDER BY COUNT("sample_userrating"."id") DESC;

最后,我使用 Count 而不是 Sum,因为我假设您想知道一部电影有多少票,而不是所有主键的总和:)

关于python - 多对多 Django ORM 的分组和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com