Django:在模板中呈现外键模型特定字段的平均值

时间:2018-10-30 10:55:44

标签: python django

我的系统包括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>

1 个答案:

答案 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