Django Rest Framework自定义序列化方法

时间:2016-06-13 20:02:48

标签: python django serialization django-rest-framework

我正在尝试创建一个自定义序列化程序方法,该方法计算来自QuizResults模型的传递和失败测验的数量。失败的测验在.7以下,通过的测验是.7或以上。

我希望能够查看用户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

感谢任何帮助。

编辑:

我扩展了用户模型并添加了一个像你建议的模型方法。

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

不幸的是,当我添加它时,一旦添加了这些内容,框架中就不会出现任何内容。有什么建议?谢谢。

1 个答案:

答案 0 :(得分: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

您可以复制此次以获得失败的测验数。