簡體   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