如何解决Django模型关系使平均评级成为评级数字段的平均值
所以我有两个Django模型'Movie'和'Rating',我希望Movie字段avg_rating是该电影编号字段的平均评分。我还希望每次添加评论时,电影字段上的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,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
或{{1} },以在每次调用该对象的视图(例如ModelForm
)时计算每个对象的平均评分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。