Estoy trabajando en una aplicación django que contiene un montón de objetos relacionados. Tengo objetos de prueba, cada uno con un conjunto ordenado de preguntas (cada pregunta tiene una propiedad correct_answer). Y también tengo objetos de intento de prueba, que están relacionados con objetos de prueba mediante una clave externa y cada uno tiene su conjunto ordenado de intentos de preguntas, cada uno con una propiedad de elección. Esencialmente, cada intento de pregunta corresponde a una pregunta (un intento de prueba solo pasa la validación tiene el mismo número de intentos de pregunta que la prueba con la que está relacionada tiene preguntas), y luego puedo verificar el porcentaje correcto e incorrecto generando una lista de valores de respuestas y opciones correctas y comparar las dos listas. Mi modelo se parece a esto:

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')

Si echas un vistazo al modelo QuestionAttempt y dentro de él, el método isCorrect, ves cómo mi situación. Parece que esa es la única forma de verificar la obtención de una granularidad por pregunta para verificar si un intento de pregunta dado es correcto o incorrecto. Mi problema es que esta declaración es literalmente 3 o 4 consultas de base de datos únicas (ni siquiera puedo decir que hay tantas). Estaba pensando en usar declaraciones F, pero no sé el nombre predeterminado de la columna de orden que usa django al especificar order_with_respect_to. Además, para obtener la puntuación de una pregunta determinada, también necesito hacer más de 3 consultas de base de datos. ¿Hay una mejor manera de hacer esto? ¿Cómo puedo acceder a la entrada db para el pedido? Hice algunas búsquedas y hay una propiedad llamada _order aplicada tanto a la pregunta como al modelo de intento de pregunta. ¿Puedo usar esto de manera confiable? Esto simplificaría enormemente parte del código porque también podría consultar la base de datos usando un filtro en la propiedad _order

0
ecbtln 3 ene. 2012 a las 20:20

1 respuesta

La mejor respuesta

El problema está en su lógica al configurar los modelos. Un QuestionAttempt debe estar directamente relacionado con un Question. Confiar en que el orden sea el mismo es, en el mejor de los casos, dudoso y lo más probable es que falle en algún momento.

1
Chris Pratt 3 ene. 2012 a las 20:41
Gracias, rehice mi modelo para que cada intento de pregunta tenga una clave extranjera para volver a una pregunta y solo se ordenen las preguntas
 – 
ecbtln
12 ene. 2012 a las 19:37