代码之家  ›  专栏  ›  技术社区  ›  msln

从3个相互关联的表中获取数据,并将其显示在模板django中

  •  1
  • msln  · 技术社区  · 8 年前

    我想在我的网站上进行一次调查。我为此创建了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 在第一个模型中是指一个模型。当我转到与每个相关的页面时 克拉斯 ,我必须查看 克拉斯 .

    克拉斯

    1 回复  |  直到 8 年前
        1
  •  0
  •   PhoebeB    8 年前

    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 %}