2016-06-13 7 views
2

Ich versuche, eine benutzerdefinierte Serialisierungsmethode zu erstellen, die die Anzahl der bestandenen und fehlgeschlagenen Tests in meinem QuizResults-Modell zählt. Ein fehlgeschlagener Quiz ist unter .7 und ein bestandener Quiz ist .7 oder älter.Django Rest Framework Benutzerdefinierte Serializer-Methode

Ich möchte in der Lage sein, in die Benutzer QuizResult und die Anzahl der bestandenen Tests (.7 oder höher) zu zählen. Ich würde dann die Methode duplizieren, um die fehlgeschlagenen Tests zu zählen (unter .7).

Bisher habe ich nicht viel Ahnung, wie es geht. Ich möchte in der Lage sein, das percent_correct-Feld des Modells zu erfassen und eine Berechnung durchzuführen und sie einem Feld im Serializer namens "quiz_passed" hinzuzufügen.

Hier ist mein QuizResult Modell:

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 

Hier ist meine Serializer:

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 

Jede Hilfe sehr geschätzt wird.

Edit:

I erweitert die User-Modell und hat eine Modell-Methode, wie Sie vorgeschlagen.

class Profile(User): 

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

Ich habe dann Ihren Vorschlag zu meinem ProfileSerializer hinzugefügt.

Leider, wenn ich das hinzufügen, erscheint nichts im Rahmen, sobald diese hinzugefügt wurden Irgendwelche Vorschläge? Vielen Dank.

Antwort

3

Sie können ein model method auf dem Benutzermodell verwenden, die Benutzer-Anzahl von hindurchgegangenen Tests zu zählen:

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

Dann, dass eine DRF mit zu Ihrem Serializer hinzufügen ReadOnlyField diese Methode zur Serialisierung:

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 

Sie können dies für die Anzahl der fehlgeschlagenen Tests duplizieren.

+0

'return selb.quiz_parent.filter (percent_correct> 0.7) .count()' muss '' sein selbstregeln.quiz_parent.filter (percent_correct__gte = 0.7) .count() ' – Fush

+0

Danke, aktualisiert! – YPCrumble

+0

Ich habe deine Vorschläge angewendet, aber sie haben nicht funktioniert. Kannst du meine Bearbeitung überprüfen? Danke für die Hilfe! – Ryan113

Verwandte Themen