2016-06-13 2 views
2

J'essaie de créer une méthode de sérialisation personnalisée qui compte le nombre de quiz réussis ou échoués de mon modèle QuizResults. Un quiz échoué est sous .7 et un quiz passé est .7 ou plus. Je veux pouvoir consulter le QuizResult des utilisateurs et compter le nombre de quiz passés (.7 ou plus). Je dupliquerais alors la méthode pour compter les quiz échoués (sous .7).Méthode de sérialiseur personnalisé Django Rest Framework

Jusqu'à présent, je n'ai pas beaucoup d'idée sur la façon de le faire. Je veux être en mesure d'attraper le champ percent_correct du modèle et faire un calcul et l'ajouter à un champ dans le sérialiseur appelé "quiz_passed".

Voici mon modèle QuizResult:

class QuizResult(models.Model): 
    quiz = models.ForeignKey(Quiz) 
    user = models.ForeignKey(User, related_name='quiz_parent') 
    percent_correct = models.FloatField(validators=[MinValueValidator(0.0), MaxValueValidator(1.0)]) 
    date = models.DateTimeField(auto_now_add=True) 

    def __str__(self): 
     return 'Quiz Results for : ' + self.quiz.title 

Voici mon sérialiseur:

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    todo_count = serializers.IntegerField(source='todo_parent.count', read_only=True) 
    discussion_count = serializers.IntegerField(source='comment_parent.count', read_only=True) 
    quiz_passed = serializers.SerializerMethodField() 

    class Meta: 
     model = User 
     fields = ('todo_count', 'discussion_count', 'quiz_passed', 'username',) 

    def get_quiz_passed(self, obj): 
     return passed 

Toute aide est appréciée.

Edit:

J'ai étendu le modèle utilisateur et ajouté une méthode de modèle comme vous le suggérez.

class Profile(User): 

    def get_quizzes_passed_count(self): 
     return self.quiz_parent.filter(percent_correct__gte=0.8).count() 

J'ai ensuite ajouté votre suggestion à mon ProfileSerializer.

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    todo_count = serializers.IntegerField(source='todo_parent.count', read_only=True) 
    discussion_count = serializers.IntegerField(source='comment_parent.count', read_only=True) 
    num_quizzes_passed = serializers.ReadOnlyField(source="get_quizzes_passed_count") 

class Meta: 
    model = Profile 
    fields = ('todo_count', 'discussion_count', 'num_quizzes_passed', 'username') 

Malheureusement, lorsque j'ajoute ceci, rien n'apparaît dans le cadre une fois que ceux-ci ont été ajoutés. Aucune suggestion? Je vous remercie.

Répondre

3

Vous pouvez utiliser un model method sur le modèle de l'utilisateur de compter le nombre de l'utilisateur des jeux-questionnaires passés:

class User(models.model): 
    # rest of your User attributes 
    def get_quizzes_passed_count(self): 
     return self.quiz_parent.filter(percent_correct__gte=0.7).count() 

ajouter ensuite que votre sérialiseur en utilisant un DRF ReadOnlyField sérialiser cette méthode:

class ProfileSerializer(serializers.HyperlinkedModelSerializer): 
    todo_count = serializers.IntegerField(
     source='todo_parent.count', read_only=True 
    ) 
    discussion_count = serializers.IntegerField(
     source='comment_parent.count', read_only=True 
    ) 
    quiz_passed = serializers.SerializerMethodField() 
    num_quizzes_passed = serializers.ReadOnlyField(source="get_quizzes_passed_count") 

    class Meta: 
     model = User 
     fields = ('todo_count', 'discussion_count', 'quiz_passed', 'username',) 

    def get_quiz_passed(self, obj): 
     return passed 

Vous pouvez dupliquer ceci pour le nombre de tests qui ont échoué.

+0

'return self.quiz_parent.filter (percent_correct> 0.7) .count()' doit être 'return self.quiz_parent.filter (percent_correct__gte = 0.7) .count()' – Fush

+0

Merci, mise à jour! – YPCrumble

+0

J'ai appliqué vos suggestions, mais elles n'ont pas fonctionné. Pouvez-vous vérifier mon édition? Merci pour l'aide! – Ryan113