首页 > 解决方案 > 为 Django 模型中的评分生成平均值并与其他模型一起返回

问题描述

我正在使用 Python(3.7) 和 Django(2.1) 开发一个项目,我正在尝试在其中实施评级系统。

注意:我搜索了很多并查看了各种相关问题,但找不到针对我的具体问题的任何解决方案,所以请不要将其标记为重复!

我有两个模型:

来自models.py

class Gig(models.Model):
    CATEGORY_CHOICES = (
        ('GD', 'Graphic & Design'),
        ('DM', 'Digital Marketing'),
        ('WT', 'Writing & Translation'),
        ('VA', 'Video & Animation'),
        ('MA', 'Music & Audio'),
        ('PT', 'Programming & Tech'),
        ('FL', 'Fun & Lifestyle'),
    )

    title = models.CharField(max_length=500)
    category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
    description = models.CharField(max_length=1000)
    price = models.IntegerField(blank=False)
    photo = models.FileField(upload_to='gigs')
    status = models.BooleanField(default=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

class GigReview(models.Model):
    RATING_RANGE = (
        ('1', '1'),
        ('2', '2'),
        ('3', '3'),
        ('4', '4'),
        ('5', '5')
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    gig = models.ForeignKey(Gig, on_delete=models.CASCADE, related_name='rates')
    order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
    rating = models.IntegerField(choices=RATING_RANGE,)
    content = models.CharField(max_length=500)

    def __str__(self):
        return self.content

来自views.py

def home(request):
    gigs = Gig.objects.filter(status=True)
    return render(request, 'home.html', {'gigs': gigs})

所以,每个Gig人都有很多评论,我想将average每个演出的评分返回到模板,我该如何实现?

标签: pythondjangopython-3.xdjango-modelsdjango-2.0

解决方案


一个简单的注释应该在一个查询中完成(而不是Gig在使用属性时每次一个):

from django.db.models import Avg

gigs = (Gig.objects
    .filter(status=True)
    .annotate(avg_review=Avg('rates__rating'))
)

推荐阅读