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

如果将SerializerModelForm用于Movie模型,您还可以将该方法的名称添加到该Serializer或{{1} },以在每次调用该对象的视图(例如ModelForm)时计算每个对象的平均评分。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...