YuuN0808
@YuuN0808 (YuuN)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

djangoで評価の平均が出力されない

解決したいこと

ここに解決したい内容を記載してください。

例)
djangoで書籍ごとの評価の平均を出力したいのですが表示されないです。
どのようにしたら出力されるでしょうか?

該当するソースコード

以下がviews.pyに書いたコードです。

def book_review(request, book_id):
    book = Book.objects.get(book_id=book_id)
    points = Impression.objects.filter(book=book)
    average = points.aggregate(Avg("point"))
    
    if average == None:
        average = 0
    average = round(average,3)
    
    return render(request, "rbr/book_list.html",  {"average":average})

以下がmodels.pyです。



class Book(models.Model):
    name = models.CharField('書籍名', max_length=255)
    publisher = models.CharField('出版社', max_length=255, blank=True)
    page = models.IntegerField('ページ数', blank=True, default=0)
    author = models.CharField("著者", max_length=255, blank=True)
    image = models.ImageField(upload_to = "media/", verbose_name="画像", null=True, blank=True)
    

def __str__(self):
    return self.name




class Impression(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name='書籍', related_name='impressions')
    point = models.IntegerField("点数", validators=[MinValueValidator(0), MaxValueValidator(100)], default=0)
    comment = models.TextField('コメント', blank=True)

def __str__(self):
    return self.comment

以下が出力させたいHTMLの部分です。

  <td>{{ average }}</td>

ただ表示されないだけなので、pointの値がどこかでしっかりとれていないのだと思うのですが何がいけないのかわからないです。。。

0

2Answer

現在のコードだと、このように辞書型で返ってくると思います。

shell
>>> Book.objects.aggregate(Avg('price'))
{'price__avg': 34.35}

>>> Book.objects.aggregate(Avg('price'))['price__avg']
34.35

こんな使い方もできます。

shell
>>> from django.db.models import Avg, Max, Min

>>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

公式ドキュメントも張っておきますね

1Like

Your answer might help someone💌