2016-06-13 21 views
2

私はQuizResultsモデルから渡された、または失敗したクイズの数を数えるカスタムシリアライザメソッドを作成しようとしています。失敗したクイズは.7未満で、合格したクイズは.7以上です。Django Rest Frameworkカスタムシリアライザメソッド

私はユーザーQuizResultを調べ、渡されたクイズ(.7以上)の数を数えたいと思っています。私は失敗したクイズを数える方法を複製します(.7)。

これまでのところ、私はこれを行う方法についてあまりよく分かりません。モデルのpercent_correctフィールドをつかんで計算を行い、それをシリアライザの "quiz_passed"というフィールドに追加したいと考えています。ここで

は私の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 

は私のシリアライザです:

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 

すべてのヘルプは高く評価されます。

編集:

私はUserモデルを拡張し、提案のようなモデルのメソッドを追加しました。

class Profile(User): 

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

次に、私の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') 

残念なことに私がこれを追加すると、これらは追加されたフレームワークには何も表示されません。助言がありますか?ありがとうございました。

答えて

3

あなたが渡されたクイズのそのユーザの数をカウントするために、ユーザーモデルにmodel methodを使用することができます。

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

は、その方法をシリアル化するためにDRF ReadOnlyFieldを使用して、シリアライザにそれを追加します。

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 

これを失敗したクイズの数だけ複製できます。

+0

'return self.quiz_parent.filter(percent_correct> 0.7).count()'は返される必要があります。self.quiz_parent.filter(percent_correct__gte = 0.7).count() ' – Fush

+0

ありがとうございました! – YPCrumble

+0

私はあなたの提案を適用しましたが、動作しませんでした。私の編集をチェックできますか?お手伝いありがとう! – Ryan113

関連する問題