2012-01-03 162 views
0

我正在處理包含一堆相關對象的django應用程序。我有測試對象,每個對象都有一組有序的問題(每個問題都有一個correct_answer屬性)。而且我也有測試嘗試對象,這些對象通過外鍵與測試對象相關聯,並且每個對象都有一組有問題的嘗試,每個都有一個選擇屬性。從本質上講,每個問題的嘗試對應一個問題(一個測試嘗試只通過驗證它有相同數量的問題嘗試,因爲它與測試有關的問題),然後我可以通過輸出一個values_list來檢查正確與錯誤的百分比correct_answers和選擇並比較這兩個列表。我的模型看起來是這樣的:django order_with_respect_to與相關對象

ANSWERS = ((0,''),(1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E')) 

class Question(models.Model): 
    test = models.ForeignKey(Test,related_name='questions') 
    correct_answer = models.IntegerField(max_length=1,choices=ANSWERS) 

    def _get_score(self): 
     answers = self.test.test_attempts.values_list('answers_choice',flat=True)[self.test.get_question_order().index(self.pk)::self.test.questions.count()] 
     scores = [x==self.correct_answer for x in answers] 
     length = len(correct) 
     if length == 0: 
      return 0 
     return float(sum(scores))/length 
    score = property(_get_score) 

    class Meta: 
     order_with_respect_to = 'test' 

class Test(models.Model): 
    testID = models.CharField(max_length=50,verbose_name='Test identification information') 

    def _get_score(self): 
     scores = [x.score for x in self.test_attempts.all()] 
     length = len(scores) 
     if length == 0: 
      return 0 
     return float(sum(scores))/length 

    score = property(_get_score) 

class QuestionAttempt(models.Model): 
    test_attempt = models.ForeignKey(TestAttempt,related_name='answers') 
    choice = models.IntegerField(max_length=1,choices=ANSWERS) 

    def isCorrect(self): 
     return self.choice == Question.objects.get(pk=self.test_attempt.test.get_question_order()[self.test_attempt.get_questionattempt_order().index(self.pk)]).correct_answer 

    class Meta: 
     order_with_respect_to = 'test_attempt' 

class TestAttempt(models.Model): 
    test = models.ForeignKey(Test,related_name='test_attempts') 
    student = models.ForeignKey(UserProfile,related_name='test_attempts') 

    def _get_score(self): 
     responses = self.answers.values_list('choice',flat=True) 
     correctAnswers = self.test.questions.values_list('correct_answer',flat=True) 
     s = [x==y for x,y in zip(responses,correctAnswers)] 
     length = len(s) 
     if length == 0: 
      return 0 
     return float(sum(s))/length 

    score = property(_get_score) 

    class Meta: 
     unique_together = ('student','test') 

如果你看一看的QuestionAttempt型號和之中,該isCorrect方法,你怎麼看我的困境。看起來好像這是檢查獲取每問題粒度以檢查給定問題嘗試是對還是錯的唯一方法。我的問題是,這一個陳述是字面上3或4個獨特的數據庫查詢(我甚至不能說有這麼多)。我正在考慮使用F語句,但我不知道django在指定order_with_respect_to時使用的排序列的默認名稱。另外,爲了獲得給定問題的分數,我還需要做3+分貝查詢。有一個更好的方法嗎?我如何訪問訂單的數據庫條目。我做了一些搜索,並將一個名爲_order的屬性應用於問題和問題嘗試模型。我可以可靠地使用它嗎?這將大大簡化一些代碼,因爲我可以使用_order屬性上的過濾器來查詢數據庫。

回答

1

問題在於您的邏輯設置模型。 A QuestionAttempt應該與Question直接相關。依賴於相同的順序是可疑的,最有可能在某個時候失敗。

+0

謝謝我redid我的模型,以便每個問題的嘗試有一個foreignkey回到一個問題,只有問題是排序 – ecbtln 2012-01-12 15:37:55