在相关对象上运行注释或聚集并在模板中渲染?

时间:2019-04-22 17:46:51

标签: django

我正在尝试数学/查找最大/平均等。在我的视图中,然后将其呈现在模板中,但是我似乎无法弄清楚如何使它完成所有工作。计算需要在相关对象上进行,我觉得我已经尝试了一切。尽我的智慧。

views.py

def program_detail_view(request, primary_key):
    survey = Survey.objects.get(pk=primary_key)
    maxResp = survey.objects.annotate(max_resp=Max('responseRelevance'))
    context = {'survey' : survey, 'maxResp': maxResp}
    return render(request, 'relevance/programStats.html', context=context)

models.py

class Survey(models.Model):
    ...
class Choice(models.Model):
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    creationDate = models.DateTimeField(auto_now_add=True)
    pce = models.IntegerField(
        validators=[MaxValueValidator(4),
        MinValueValidator(1)], choices=radioChoices,
        )
    interest = models.IntegerField(
        validators=[MaxValueValidator(4),
        MinValueValidator(1)], choices=radioChoices,
        )
    responseRelevance = models.IntegerField(blank=True)

template.html

    <li>Overall Relevance Score: {{ maxResp }}</li>

我希望视图将输出来自选择集的最大响应,但是无论我如何调用它,模板中都不会显示任何内容。对于平均和其他注释/汇总函数,我已经尝试过相同的方法。

1 个答案:

答案 0 :(得分:1)

您可以聚集到给定的Survey对象上,或者注释您要在第一个查询中检索的调查对象。后者仅导致单个数据库查询,因此效率可能更高。

因此,我们可以.annotate(..) Survey个对象查询,并且作为注释,我们使用Max('choice__responseRelevance'),因为我们想在所有与相关的事件中获得最大的responseRelevance 选择:

def program_detail_view(request, primary_key):
    survey = Survey.objects.annotate(
        max_resp=Max('choice__responseRelevance')
    ).get(pk=primary_key)
    context = {'survey' : survey}
    return render(request, 'relevance/programStats.html', context=context)

现在我们可以使用以下方式渲染此带注释的值:

<li>Overall Relevance Score: {{ survey.max_resp }}</li>