python - 如何从 Django 中的外键值中取平均值?
问题描述
我在 Django 中有这样的书籍模型和评论模型:
class Book(models.Model):
ratings = models.FloatField()
class Review(models.Model):
book = models.ForeignKey(
Book,
on_delete=models.CASCADE,
related_name='reviews',
)
review = models.CharField(max_length=5000)
score = models.PositiveSmallIntegerField(null=True, blank=True,
validators=[MinValueValidator(0), MaxValueValidator(10)])
如何在 Book 中创建一个方法来计算评分(这是与特定书籍相关的所有评论的平均值)?
解决方案
您可以实现如下属性:
from django.db.models import Avg
class Book(models.Model):
@property
def ratings(self):
return self.reviews.aggregate(avg_score=Avg('score'))['avg_score']
或者,如果您需要批量执行此操作,您可以注释您的查询集:
from django.db.models import Avg
Book.objects.annotate(
avg_rating=Avg('reviews__score')
)
Book
从此查询集中产生的对象将具有一个额外的属性avg_rating
,其中包含score
相关Review
s 的平均值。
推荐阅读
- java - 使用 Spring 框架的静态资源版本控制不起作用
- c# - DbQuery 返回空值
- sql - 连接表的行和具有相同字段名称的子查询
- azure - Azure 工作簿中 JSON 查询的查询功能和语法是什么?
- docker - Docker not running/starting in MacOS mojave and fails with supervisor has failed message
- python - 优化递归代码以从输入数组生成有效数组
- php - How to load mysqli extension inside docker-compose.yml file with NGINX, PHP-FPM
- angular - Dates not binding in Angular
- python - Pytest 正在搜索更高一级的 conftest
- html - Applying image to grid