2012-09-10 65 views
0

我正在爲Django的問卷類型應用程序工作。 當參與者完成調查問卷時,會創建一個AnswerSet對象,該對象將其用戶對象鏈接到QuestionAnswer對象列表,其中每個對應的問題對應一個。Django在過濾後僅獲取最近的對象

class AnswerSet(models.Model): 

    user=models.ForeignKey(User) 
    questionnaire=models.ForeignKey(Questionnaire) 


class QuestionAnswer(models.Model):  

    question = models.ForeignKey(Question) 
    answer = models.CharField(max_length=255) 
    answer_set = models.ForeignKey(AnswerSet) 

該應用程序允許人們重新填寫問卷,在這種情況下使用其現有的答案呈現形式,併爲將要更新的答案,創建並保存新的問題答案的對象。因此

我的問題是這樣的:

爲了顯示當參與者被編輯問卷最近的答案,我希望能夠得到一個AnswerSet,然後過濾QuestionAnswers讓我得到一個對於任何問題,如果有多個問題答案,我只希望看到最近的問題

+0

是否有任何你的表具有inserion時間作爲列? –

+0

你是否也想存儲以前的答案?如果不是,那麼當您爲'QuestionAnswer'創建模型表單時,請使用現有實例,以便在保存表單時更新實例。 – Rohan

+0

不,我沒有插入時間,但可以很容易地添加,我正在考慮使用主鍵來確定最新的答案。 @羅漢是的,我想保持對答案的審計跟蹤。 – Ctrlspc

回答

0

感謝@Rohan的建議和此帖子Django query select distinct by field pairs我找到了適用於我的解決方案,希望別人也會覺得它有用! 我添加了一個新的模式:

class LatestQuestionAnswer(models.Model): 
    question = models.ForeignKey(Question) 
    question_answer = models.ForeignKey(QuestionAnswer) 
    answer_set = models.ForeignKey(AnswerSet) 
    created = created = models.DateTimeField(auto_now_add=True) 

並推翻了我的QuestionAnswerModel保存功能,所以它看起來像:

def save(self, force_insert=False, force_update=False, using=None): 
     super(QuestionAnswer, self).save(force_insert=force_insert, force_update=force_update, using=using) 

     try: 
      record = LatestQuestionAnswer.objects.get(question=self.question, answer_set=self.answer_set) 

      if record.question_answer == self: 
       return#nothing to do no point updating the record as it is already correct 

     except ObjectDoesNotExist: 
      record = LatestQuestionAnswer(question=self.question, answer_set= self.answer_set) 

     record.question_answer = self 
     record.save() 

現在,每當我需要獲得所有最新QuestionAnswers列表我可以做這樣的事情:

most_recent_answers = [record.question_answer for record in LatestQuestionAnswer.objects.filter(answer_set=<an_answer_set>)]