python - 为 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
每个演出的评分返回到模板,我该如何实现?
解决方案
一个简单的注释应该在一个查询中完成(而不是Gig
在使用属性时每次一个):
from django.db.models import Avg
gigs = (Gig.objects
.filter(status=True)
.annotate(avg_review=Avg('rates__rating'))
)
推荐阅读
- php - FormData() 没有按预期工作 - Laravel/Vue 文件上传
- jquery - 在选择卡时覆盖复选图标
- r - R中的POSIXct,错误?
- angular - 角度7显示来自对象数组的图像
- html - 在列表中捕获不同 ng-switch 的值
- android - Kotlin spinner 使用 2 路数据绑定在 Textview 中设置选定值
- sql - 根据每个字段的顺序查询返回列表(SQL)
- ssh - 如何通过 SSH 在 Windows Monitor 上打开 selenium 浏览器?
- c++ - OpenGL中的同步
- javascript - ASP.NET Core API 中的模型绑定始终为空