現在Djangoでレビューサイトを作っているのですが、商品ごとの評価(★1~★5)の平均値の求め方がわからず行き詰っています。
その点についてアドバイスをいただきたくこの度質問させていただきました。
該当のソースコード
models.pyが以下の通りです。
Python
1class Product(models.Model): 2 name = models.CharField(max_length=255) 3 content = models.TextField() 4 description = models.TextField(blank=True) 5 created_at = models.DateTimeField(auto_now_add=True) 6 updated_at = models.DateTimeField(auto_now=True) 7 published_at = models.DateTimeField(blank=True, null=True) 8 is_public = models.BooleanField(default=False) 9 image = models.ImageField( 10 upload_to='player_images/', null=True, blank=True) 11 12 class Meta: 13 ordering = ['-created_at'] 14 15 def save(self, *args, **kwargs): 16 if self.is_public and not self.published_at: 17 self.published_at = timezone.now() 18 super().save(*args, **kwargs) 19 20 def __str__(self): 21 return self.title 22 23SCORE_CHOICES = ( 24 (1, '★1'), 25 (2, '★2'), 26 (3, '★3'), 27 (4, '★4'), 28 (5, '★5'), 29) 30 31class Comment(models.Model): 32 product = models.ForeignKey( 33 Product, on_delete=models.CASCADE, related_name='comments') 34 author = models.CharField(max_length=50) 35 rate = models.PositiveSmallIntegerField(verbose_name='総合評価', null=True, default=3, choices=SCORE_CHOICES) 36 convenience = models.PositiveSmallIntegerField(verbose_name='使いやすさ', null=True, default=3, choices=SCORE_CHOICES) 37 appearance = models.PositiveSmallIntegerField(verbose_name='見た目', null=True, default=3, choices=SCORE_CHOICES) 38 defense = models.PositiveSmallIntegerField(verbose_name='コストパフォーマンス', null=True, default=3, choices=SCORE_CHOICES) 39 text = models.TextField() 40 timestamp = models.DateTimeField(auto_now_add=True) 41 42 class Meta: 43 ordering = ['-timestamp'] 44 45 def __str__(self): 46 return self.text 47
試したこと
ひとまず総合評価(rate)のみの平均値を表示したく、views.pyに以下の通り書き込みましたが、HTMLに出力されませんでした。
Python
1def product_detail(request, id): 2 product = Poduct.objects.get(id=id) 3 reviews = Comment.objects.filter(product=id) 4 average = reviews.aggregate(Avg("rate")) 5 6 if average == None: 7 average = 0 8 average = round(average,2) 9 10 context = { 11 "product": product, 12 "reviews": reviews, 13 "average": average, 14 } 15 return render(request, 'product/product_detail.html', context)
HTML
1<p>Rating:{{ average }}/5</p>
この場合どのように書けば平均値が出力できますでしょうか?
もしよろしければアドバイスよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/01 12:21