首页 > 解决方案 > 如何从 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 中创建一个方法来计算评分(这是与特定书籍相关的所有评论的平均值)?

标签: pythondjangodjango-models

解决方案


您可以实现如下属性:

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相关Reviews 的平均值。


推荐阅读