Django:如何使用 Django 显示所有评分的平均值?

Django: How to display the average of all rating using django?

我正在创建一个用户可以使用 django 对书籍进行评分的功能,我已经实现了用户可以使用来自前端的表单对书籍进行评分并将其保存在后端的部分。现在我想要实现的是一种显示用户所有评分的平均值的方法。例如,假设有 usera - 1.0userb - 3.0userc -5.0。我想显示 3.0 的平均值,但我不知道如何实现。让男人把我写的一些代码放在下面

models.py

USER_BOOK_RATING = (
        ("1.0", "★☆☆☆☆ (1/5)"),
        ("2.0", "★★☆☆☆ (2/5)"),
        ("3.0", "★★★☆☆ (3/5)"),
        ("4.0", "★★★★☆ (4/5)"),
        ("5.0", "★★★★★ (5/5)"),
)

class BookRating(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE, null=True)
    rating = models.CharField(max_length=1000, choices=USER_BOOK_RATING)
    review = models.TextField()

view.py - 我所做的只是列出所有评论,而不是平均星级

首先,我会使用 DecimalField 而不是 CharField - 你不能真正对字符串进行数学运算。这看起来像:

from decimal import Decimal

USER_BOOK_RATING = (
        (Decimal("1.0"), "★☆☆☆☆ (1/5)"),
        (Decimal("2.0"), "★★☆☆☆ (2/5)"),
        (Decimal("3.0"), "★★★☆☆ (3/5)"),
        (Decimal("4.0"), "★★★★☆ (4/5)"),
        (Decimal("5.0"), "★★★★★ (5/5)"),
)

class BookRating(models.Model):
    # rest of model as before
    rating = models.DecimalField(max_digits=2, decimal_places=1, choices=USER_BOOK_RATING)

更改后,您可以使用 aggregateAvg - 例如:

from django.db.models import Avg

# Get average score of all books
average = BookRating.objects.aggregate(avg=Avg('duration'))
# Returns a dict - if using Decimal fields you'll get something like:
# {'avg': Decimal('3.81818181818182')}

aggregate 调用之前添加您的过滤,希望这能让您接近您正在寻找的解决方案。

您可能还想看看 django-star-ratings - 我们在工作中编写的一个库,因为我们一直需要实施星级评分。不确定它是否完全适合 - 它没有评论 - 但它看起来接近你想要实现的目标,或者至少你可以看到灵感的来源。