2017-09-05 26 views
1

我想在我的網站中實施調查。我創建了這3代表以下是每個模型的片段:從3個相互關聯的表格中獲取數據並將其顯示在模板中 - django

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是指大學班級。

回答

0

我喜歡把所有與數據相關的事情都放到模型中,所以這將是我的方法。請注意,我刪除了_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 %} 
相關問題