从 3 个相互关联的表中获取数据并将它们显示在模板中 - django
Getting data from 3 tables that related to each other and displaying them in a template - 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
指大学类。
我喜欢将与数据有关的一切都放入模型中,所以这就是我的方法。请注意,我已经删除了您的 _id,否则您最终会参考 Option.survey_id.id 以获得 id 或 Option.survey_id.text,这更加令人困惑。
在models.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 %}
我想在我的网站上进行调查。我为此创建了 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
指大学类。
我喜欢将与数据有关的一切都放入模型中,所以这就是我的方法。请注意,我已经删除了您的 _id,否则您最终会参考 Option.survey_id.id 以获得 id 或 Option.survey_id.text,这更加令人困惑。
在models.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 %}