Запуск аннотирования или агрегирования связанных объектов и рендеринга в шаблоне? - PullRequest
1 голос
/ 22 апреля 2019

Я пытаюсь сделать математику / найти максимальную / среднюю и т. Д. в моих представлениях, а затем визуализировать их в шаблоне, но я не могу понять, как заставить его работать. Расчеты должны быть сделаны над связанными объектами, и я чувствую, что я все перепробовал. На моем остроумии.

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 Ответ

1 голос
/ 22 апреля 2019

Вы можете либо агрегировать по заданному Survey объекту, либо аннотировать ваш объект опроса, который вы извлекаете в первом запросе. Последнее приводит только к одному запросу к базе данных и, следовательно, скорее всего, немного более эффективно.

Таким образом, мы можем .annotate(..) наш Survey объектный запрос, и в качестве аннотации мы используем Max('choice__responseRelevance'), так как мы хотим получить максимум responseRelevance для всех связанных вариантов выбора:

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

теперь мы можем отобразить это аннотированное значение с помощью:

<li>Overall Relevance Score: {{ <b>survey.max_resp</b> }}</li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...