【问题标题】:Getting data from 3 tables that related to each other and displaying them in a template - django从 3 个相互关联的表中获取数据并在模板中显示它们 - django
【发布时间】:2018-02-14 01:36:02
【问题描述】:

我想在我的网站上实施一项调查。我为此创建了 3 个表,下面是每个模型的 sn-p:

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 指大学课程。

【问题讨论】:

    标签: django django-templates django-views django-orm


    【解决方案1】:

    我喜欢将与数据有关的所有内容都放入模型中,所以这就是我的方法。请注意,我已经删除了您的 _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 %}
    

    【讨论】:

      猜你喜欢
      • 2016-01-14
      • 2021-09-19
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多