繁体   English   中英

Django:如何连接和注释多个SQL表?

[英]Django: how to join and annotate multiple sql tables?

我正在构建一个示例django应用程序,并且无法正确聚合一些sql结果。

考虑以下三种模型:

电影模特

class Movie(models.Model):
    source_id = models.CharField(max_length=100, primary_key=True)
    title = models.CharField(max_length=200, validators=[MinLengthValidator(1)])

评分模型

class Rating(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    rating = models.PositiveIntegerField()
    username = models.CharField(max_length=100, validators=[MinLengthValidator(1)])

评论模型

class Comment(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    username = models.CharField(max_length=100, validators=[MinLengthValidator(1)])
    body = models.TextField()

然后考虑以下mysql表:

电影

+-----------+-----------+
| source_id |   title   |
+-----------+-----------+
| 15sdfsd4  | Spiderman |
+-----------+-----------+

评分

+----+--------+----------+----------+
| id | rating | username | movie_id |
+----+--------+----------+----------+
|  1 |      4 | jack     | 15sdfsd4 |
|  2 |      3 | mick     | 15sdfsd4 |
+----+--------+----------+----------+

评论

+----+----------+--------------------+----------+
| id | username |        body        | movie_id |
+----+----------+--------------------+----------+
|  1 | charles  | I loved this movie | 15sdfsd4 |
|  2 | mick     | Nice sound fx      | 15sdfsd4 |
+----+----------+--------------------+----------+

我想查询电影ID的列表,并获取平均评级和评论的nr的摘要。

我尝试了类似的东西

ids = ['15sdfsd4','54fdf5d']
m = Movie.objects.filter(source_id__in=ids).annotate(Avg('rating'), Count('comment'))

我希望ID为15sdfsd4的电影的评论计数为2,平均评级为3.5。 取而代之的是,我得到4的评论数和1.5的平均评分,这对我来说意义不大...

你有什么建议吗? 谢谢

以下解决方案有两件事是错误的

  • 您未指定要在(rating_rating)上求平均值的列
  • Django结合了多个注释错误线程

考虑到计数总和具有重复且平均值相同,这可能会起作用

 m = Movie.objects.filter(source_id__in=ids).annotate(
     Avg('rating__rating'), 
     Count('comment',distinct=True)
 )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM