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

Django: how to join and annotate multiple sql tables?

我正在构建一个示例 Django 应用程序,但我无法正确汇总一些 sql 结果。

考虑这 3 个模型:

电影模特

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 列表并获得平均评分和评论数量的摘要。

我试过

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 组合多个注解bug and thread

考虑到计数聚合具有不同且重复项的平均值相同,这可能会起作用

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