群和多对多Django ORM之和

2024-04-18 04:42:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个出租电影商店的下一个模型。也就是说,UserRating表存储与用户相关的电影的分级。我试着做一个视图,在那里可以得到相应的图像的电影分级排序。我知道如何按等级分类(UserRating.objects.values值('movie\u id').annotate(dcount=Sum('vote')).order\u by('dcount'))。我现在的问题是?如何得到我拍的这些电影的影像?你知道吗

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)

Tags: nameselfmodel电影modelsmovielengthmax
1条回答
网友
1楼 · 发布于 2024-04-18 04:42:10

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

相关问题 更多 >