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,我无法理解...
你有什么建议吗?谢谢
我正在构建一个示例 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,我无法理解...
你有什么建议吗?谢谢