Я работаю над приложением django, которое содержит множество связанных объектов. У меня есть тестовые объекты, каждый с упорядоченным набором вопросов (каждый вопрос имеет свойство correct_answer). И у меня также есть объекты попытки тестирования, которые связаны с объектами тестирования внешним ключом, и у каждого есть свой упорядоченный набор попыток вопроса, каждый со свойством выбора. По сути, каждая попытка вопроса соответствует вопросу (попытка теста только проходит проверку, имеет столько же попыток вопроса, сколько и тест, к которому относится вопрос), и затем я могу проверить процент правильных и неправильных путем вывода значения values_list о правильных ответах и выборе и сравнении двух списков. Моя модель выглядит примерно так:
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