Получение данных из 3 связанных друг с другом таблиц и отображение их в шаблоне — django

Я хочу провести опрос на своем сайте. Для этого я создал 3 таблицы, и ниже приведен фрагмент для каждой модели:

class Survey(models.Model):
    klass_id = models.ForeignKey(Klass, verbose_name='class', related_name='s_klass', on_delete=models.CASCADE)
    question = models.CharField(max_length=100, verbose_name='title')
    description = models.CharField(max_length=500, verbose_name='description', blank=True, null=True)
    end_date = models.DateTimeField(verbose_name='end date')


class SurveyOptions(models.Model):
    survey_id = models.ForeignKey(Survey, verbose_name='survey name', related_name='s_id', on_delete=models.CASCADE)
    text = models.CharField(max_length=50, verbose_name='option title')

class SurveyResponse(models.Model):
    option_id = models.ForeignKey(SurveyOptions, verbose_name='option name', related_name='s_option', on_delete=models.CASCADE)
    person_id = models.ForeignKey(Profile, verbose_name='responser', related_name='responser', on_delete=models.CASCADE)
    create_date = models.DateTimeField(verbose_name='date', auto_now_add=True)

После того, как пользователи ответят на опрос, я хочу получить результаты опроса и отобразить их пользователям в шаблоне. Я хочу показать вопрос опроса, варианты опроса и ответы на опрос (каждый вариант и его процент).

Что я пишу в views.py и что я пишу в шаблоне?

Klass в первой модели относится к модели. и когда я перехожу на страницу, связанную с каждым Klass, я должен видеть все опросы Klass.

Klass относится к университетским классам.


person msln    schedule 05.09.2017    source источник


Ответы (1)


Мне нравится помещать в модель все, что связано с данными, так что это будет мой подход. Обратите внимание, что я удалил ваш _id, так как в противном случае вы в конечном итоге будете ссылаться на Option.survey_id.id, чтобы получить идентификатор или Option.survey_id.text, что еще больше сбивает с толку.

В моделях.py::

class Survey(models.Model):
    klass = models.ForeignKey(Klass, verbose_name='class', related_name='s_klass', on_delete=models.CASCADE)
    question = models.CharField(max_length=100, verbose_name='title')
    description = models.CharField(max_length=500, verbose_name='description', blank=True, null=True)
    end_date = models.DateTimeField(verbose_name='end date')

    @property
    def options(self):
        return SurveyOptions.objects.filter(survey=self)



class SurveyOptions(models.Model):
    survey = models.ForeignKey(Survey, verbose_name='survey name', related_name='s_id', on_delete=models.CASCADE)
    text = models.CharField(max_length=50, verbose_name='option title')


    @property
    def response_as_pct(self):
        option_responses = SurveyResponse.objects.filter(option = self).count()
        survey_responses = SurveyResponse.objects.filter(option__in = self.survey.options).count()

        # will need to handle edge cases of 0 options or 0 responses and may not want to multiply by 100
        return option_responses/survey_responses * 100

class SurveyResponse(models.Model):
    option = models.ForeignKey(SurveyOptions, verbose_name='option name', related_name='s_option', on_delete=models.CASCADE)
    person = models.ForeignKey(Profile, verbose_name='responser', related_name='responser', on_delete=models.CASCADE)
    create_date = models.DateTimeField(verbose_name='date', auto_now_add=True)

В просмотрах::

surveys = Survey.objects.all()   or filter as required

render in whatever way passing surveys

В шаблоне::

{% for survey in surveys %}
      {% for option in survey.options %}
             {{ option.text }} - {{ option.response_as_pct }}
      {% endfor %}
{% endor %}
person PhoebeB    schedule 05.09.2017