Django模型关系使avg ratings成为ratings数字字段的平均值



所以我有两个Django模型'Movie'和'Rating',我希望Movie字段avg_Rating是属于该电影编号字段的评级的平均值。我还希望每次添加评论时都能更新电影字段上的平均评分。我是Django的新手,所以我真的不知道从哪里开始。下面是我的模型文件。如有任何帮助,将不胜感激

from django.db import models
from django.db.models import IntegerField, Model
from django.core.validators import MaxValueValidator, MinValueValidator

class Movie(models.Model):
title = models.CharField(max_length=200)
date = models.DateField()
image = models.CharField(max_length=200)
details = models.CharField(max_length=500)
genre = models.CharField(max_length=50)
duration = models.CharField(max_length=20)
classification = models.CharField(max_length=50)
avg_rating = models.PositiveSmallIntegerField(
default=1,
validators=[
MaxValueValidator(5),
MinValueValidator(0)
]
)

class Rating(models.Model):
number = models.IntegerField(
default=1,
validators=[
MaxValueValidator(5),
MinValueValidator(0)
]
)
comment = models.CharField(max_length=200, default='')
movie = models.ForeignKey(Movie, default=1, on_delete=models.CASCADE)

一个简单的方法是在Movie类中定义一个方法来返回Movie对象的平均评级。所以你只需要在你的模型中添加以下代码:

from django.db import models
from django.db.models.functions import Coalesce
from django.db.models import IntegerField, Model
from django.core.validators import MaxValueValidator, MinValueValidator

class Movie(models.Model):
title = models.CharField(max_length=200)
date = models.DateField()
image = models.CharField(max_length=200)
details = models.CharField(max_length=500)
genre = models.CharField(max_length=50)
duration = models.CharField(max_length=20)
classification = models.CharField(max_length=50)

def rating_avg(self):
return Rating.objects.filter(movie=self).aggregate(
avg=Coalesce(models.Avg('number'), 0),
)['avg']

请注意,字段评级平均值已从Movie字段中删除。现在您有了一个方法,可以为每个Movie对象调用它,该方法将在特定时间返回该对象的平均评级。

示例:

movie_object = Movie.objects.first()
if movie_object:
print(movie_object.rating_avg()) # will print average rating of that particular object

如果您使用SerializerModelForm作为Movie模型,您还可以将该方法的名称添加到该SerializerModelForm的字段中,以在调用该对象(即fields = ['title', ..., 'rating_avg'](的视图时计算每个对象的平均评级。

最新更新