我的系统包括2个模型,一个模型用于项,第二模型用于对这些项的审阅。在每条评论中,都有许多不同的字段(有趣程度,友好程度等)。
我正在尝试查询数据库,所以我可以说出我当前正在参加的音乐节(我想是PK)的平均得分(在“评论”中是该字段)。由于我是Django的新手,因此此任务对我来说有些混乱。感谢您的帮助。
Models.py
class Item(models.Model):
...
class Review(models.Model):
def get_absolute_url(self):
return reverse('festival_list:single', args=[self.festival.pk])
item = models.ForeignKey(
Item,
related_name='Item_Reviews',
on_delete=models.CASCADE,
null=False,
blank = False,
)
bad = 0
okay = 1
good = 2
great = 3
superb = 4
score_choices = (
(0, 'Bad'),
(1, 'Okay'),
(2, 'Good'),
(3, 'Great'),
(4, 'Superb'),
)
friendly = models.IntegerField(
choices=score_choices,
default=score_choices[0],
)
Views.py:
class DetailItem(generic.DetailView):
queryset = models.Item.objects.all()
def get_context_data(self, **kwargs):
context = super(DetailItem, self).get_context_data(**kwargs)
context['item_reviews'] = models.Review.objects.all()
return context
Item_detail.html:
<h4>Friendly</h4>
<p>
{% for score in item_reviews %}
{{ ?? }}
{% endfor %}
</p>
答案 0 :(得分:2)
您可以使用汇总
来计算平均值:def get_context_data(self, **kwargs): context = super(DetailItem, self).get_context_data(**kwargs) # ... context['avg_friendly'] = self.object.Item_Reviews.aggregate( avg_friendly=Avg('friendly') )['avg_friendly'] # ... return context
或更短:
def get_context_data(self, **kwargs): context = super(DetailItem, self).get_context_data(**kwargs) # ... context.update(self.object.Item_Reviews.aggregate( avg_friendly=Avg('friendly') )) # ... return context
因此,DataOffset
将为给定对象(分隔的self.object.Item_Reviews
)提供与相关的 Review
。
因此,这里的上下文包含变量Item
,该变量包含与相关的评论的avg_friendly
视图的平均值。
因此,您可以使用以下方式呈现此信息:
friendly
如果没有相关评论,则平均值为{{ avg_friendly }}
,因此我们可以使用default_if_none
template filter [Django-doc]:
None