[英]Generate average for ratings in Django models and return with other model
我正在使用Python(3.7)和Django(2.1)開發一個項目,我正在其中實施評分系統。
注意:我進行了很多搜索,並研究了各種相關問題,但找不到針對我特定問題的任何解決方案,因此請不要將其標記為重復項!
我有兩種模型:
從models.py
:
class Gig(models.Model):
CATEGORY_CHOICES = (
('GD', 'Graphic & Design'),
('DM', 'Digital Marketing'),
('WT', 'Writing & Translation'),
('VA', 'Video & Animation'),
('MA', 'Music & Audio'),
('PT', 'Programming & Tech'),
('FL', 'Fun & Lifestyle'),
)
title = models.CharField(max_length=500)
category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
description = models.CharField(max_length=1000)
price = models.IntegerField(blank=False)
photo = models.FileField(upload_to='gigs')
status = models.BooleanField(default=True)
user = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title
class GigReview(models.Model):
RATING_RANGE = (
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4'),
('5', '5')
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
gig = models.ForeignKey(Gig, on_delete=models.CASCADE, related_name='rates')
order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
rating = models.IntegerField(choices=RATING_RANGE,)
content = models.CharField(max_length=500)
def __str__(self):
return self.content
從views.py
:
def home(request):
gigs = Gig.objects.filter(status=True)
return render(request, 'home.html', {'gigs': gigs})
所以,每Gig
有很多評論,我想返回average
評級為每個演出的模板,我怎么能做到這一點?
一個簡單的注釋應該在一個查詢中完成它(而不是在使用屬性時每個Gig
一個查詢):
from django.db.models import Avg
gigs = (Gig.objects
.filter(status=True)
.annotate(avg_review=Avg('rates__rating'))
)
如果您希望能夠訪問模型級別的平均評論值,則可以在Gig
-model中添加一個屬性字段,以通過相關模型匯總平均值:
class Gig(models.Model):
...
@property
def average_rating(self):
return self.rates.all().aggregate(Avg('rating')).get('rating__avg', 0.00)
# Change 0.00 to whatever default value you want when there
# are no reviews.
然后在模板中訪問帶有average_rating
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.