从外键对象字段的值列表中获取平均值

时间:2017-01-20 15:08:34

标签: django

我正在制作一部电影评级应用。每部电影都可以由用户评分。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class FilenameDateFormat {

    SimpleDateFormat fileDateFormat = new SimpleDateFormat("yyyyMMdd");

    public static void main(String[] args) throws ParseException {

        new FilenameDateFormat("20141202", -7);
    }

    public FilenameDateFormat(String dateArg, int offsetDays) throws ParseException {

        Date fileDate = fileDateFormat.parse(dateArg);
        Calendar cal = new GregorianCalendar();
        cal.setTime(fileDate);

        cal.add(Calendar.DAY_OF_MONTH, offsetDays);

        System.out.println(cal.getTime());
    }
}

我想获得该电影的平均评分。含义

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')

我可以通过

获得MovieRating的总用户数

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

但是如何获得Total中每个用户的评分?或者我该怎么做才能获得电影的平均评分?

更新

现在我这样做,但我不知道这是否是正确的方法:

movie_rating.users.count()

2 个答案:

答案 0 :(得分:4)

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']

答案 1 :(得分:0)

尝试类似:

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