2017-01-20 5 views
0

映画評価アプリを製作中です。各ムービーはユーザーが評価することができます。外部キーオブジェクトフィールドの値のリストから平均を取得します。

class MovieRating(models.Model): 
    movie = models.OneToOneField(Movie) 
    users = models.ManyToManyField(User, through='UserRating') 
    average_rating = ??? 

    or whichever is better 

    @property 
    def average_rating(self): 
     ??? 

class UserRating(models.Model): 
    movie_rating = models.ForeignKey(MovieRating) 
    user = models.ForeignKey(User) 
    rating = models.PositiveIntegerField(
     default=1, 
     validators=[ 
      MinValueValidator(1), 
      MaxValueValidator(10) 
     ] 
    ) 
    review = models.TextField() 
    pub_date = models.DateTimeField(default=timezone.now) 

    class Meta: 
     unique_together = ('movie', 'user') 

私はその映画の平均視聴率を取得したいと思います。

average_rating = (Total rating by user for a MovieRating)/(Total users of MovieRating)

意味私は

movie_rating.users.count()

によってMovieRatingの総ユーザーを取得することができますしかし、どのように私は、合計ですべてのユーザーの評価を得るのですか?それとも、映画の平均評価を得るために私は何ができますか?

更新:

は今、私はこの方法をしていますが、私は、これは行くための正しい方法であるかどうかわからない:

sum([rate.rating for rate in movie_rating.userrating_set.all()]) 

答えて

3

def average_rating(self): 
    if self.users.count() == 0: 
     return 0.0 
    rates = 0 
    rating_list = [user_rating.rating for user_rating in self.userrating_set.all()] 
    for r in rating_list: 
     rates = r + rates 
    return rates/self.users.count() 
+0

どうすればround()を使うことができますか? '(1 + 5 + 2)/3=8/3=2.6666 ... 67'以来、私は2.7のような小数点以下1桁まで切り上げたいと思います。しかし、 'round(self.userrating_set.aggregate(Avg( 'rating'))['rating__avg']、1)'私は型エラーを出しています**浮動小数点が必要です**。 –

+0

集計平均で試してみると丸みを帯びていますが、2.666が正しく返されますか?その行だけでうまくいくはずなので、周囲のコードに関連する問題かもしれません。 – yummies

0

のような何かを試してみてください平均化を含むDjango supports aggregation queries。あなたのケースでは、オブジェクトの逆の関係を介して関連するフィールドに集約することができますintermediary model。集計はデータベースによってネイティブに実行されるため、一般的に集計は手動でそれらの値を計算するよりもお勧めします。

だからあなたの平均評価財産法

from django.db.models import Avg 

... 

@property 
def average_rating(self): 
    return self.userrating_set.aggregate(Avg('rating'))['rating__avg'] 
+0

にはい、私はまた、一種のこの方法をやっていました。リストに多数のオブジェクトがあってもループするのはいいですか? –

+0

新しいレーティングが追加されると、レーティングが再計算されるか、レーティングが再計算されます。これは、保存時に再計算するか、保存用に投稿保存を作成することを意味します。 – chaos

+0

小数点以下1桁まで評価を得る方法を教えてください。 –

関連する問題