我有租赁电影商店的下一个型号。也就是说,表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)
答案 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,因为我假设您想知道电影有多少票,而不是所有主键的总和:)