对许多Django ORM进行分组和总结

时间:2016-04-13 17:12:14

标签: python django

我有租赁电影商店的下一个型号。也就是说,表UserRating存储与用户相关的电影的评级。我正在尝试制作一个视图,其中可以获得按评级排序的相应图像的电影。我知道如何按评级排序(UserRating.objects.values(' movie_id')。annotate(dcount = Sum(' vote'))。order_by(' dcount&#39 ;))。我现在的问题是?如何获得我得到的这些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)

1 个答案:

答案 0 :(得分:1)

通常,在Django中,如果您最终想要返回有关某个模型的数据,则必须通过该模型的对象管理。在这种情况下,您正在寻找Movie中的字段,因此请先使用Movie对象管理器。

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

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,因为我假设您想知道电影有多少票,而不是所有主键的总和:)