Есть ли способ подсчета внуков с соответствующим именем в django? - PullRequest
1 голос
/ 15 марта 2020

У меня есть несколько таких моделей;

class Survey(models.Model):
    name = models.CharField(max_length=200, null=False)

class SurveyCollector(models.Model):
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE,
                               related_name='survey_collector_survey')

class SurveyResponse(models.Model):
    collector = models.ForeignKey(SurveyCollector, on_delete=models.CASCADE,
                               related_name='surveyresponse_collector')

, и я хотел бы отобразить количество ответов на опрос в survey_list. html. Мой код шаблона выглядит так:

{% for survey in surveys %}
<tr>
    <th scope="row">{{ survey.name }}</th>
    <td align="center">{{ survey.survey_collector_survey.count }}</td>
</tr>
{% endfor %}

Я могу получить сборщики опросов с помощью приведенного выше кода. Но я не могу получить истинный результат, когда я пытаюсь этот код

<td align="center">{{ survey.survey_collector_survey.surveyresponse_collector.count }}</td>

Я не могу найти правильный подход. Не могли бы вы помочь мне найти лучший способ?

1 Ответ

0 голосов
/ 15 марта 2020

Это не очень хорошая идея, так как у вас в конечном итоге возникнет проблема N + 1 : вы будете делать N + 1 запросов к базе данных. : один запрос для извлечения всех опросов и N дополнительных запросов для извлечения всех SurveyCollector с. Если вы считаете внуков, это будет даже хуже.

Вы можете просто аннотировать ваш набор запросов, например:

from django.db.models import Count

def some_view(request):
    surveys = Survey.objects.annotate(
        <b>nresponse=Count('survey_collector_survey__surveyresponse_collector')</b>
    )
    # &hellip;
    return render(request, 'some_template.html',{'surveys': surveys})

Теперь Survey объекты, которые возникают из этот набор запросов будет иметь дополнительный атрибут .nresponse, который вы затем сможете использовать при рендеринге шаблона:

{% for survey in surveys %}
<tr>
    <th scope="row">{{ survey.name }}</th>
    <td align="center">{{ survey<b>.nresponse</b> }}</td>
</tr>
{% endfor %}
...