我正在制作一部电影评级应用。每部电影都可以由用户评分。
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()
答案 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()])