所以我有两个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
如果您使用Serializer
或ModelForm
作为Movie
模型,您还可以将该方法的名称添加到该Serializer
或ModelForm
的字段中,以在调用该对象(即fields = ['title', ..., 'rating_avg']
(的视图时计算每个对象的平均评级。