django order_with_respect_to со связанными объектами - PullRequest
0 голосов
/ 03 января 2012

Я работаю над приложением 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

1 Ответ

1 голос
/ 03 января 2012

Проблема в вашей логике при настройке моделей. QuestionAttempt должен быть непосредственно связан с Question. Полагаться, что порядок одинаков, в лучшем случае сомнительно, и, скорее всего, в какой-то момент произойдет сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...