Skip to main content
 首页 » 编程设计

python之Django Rest Framework 自定义序列化器方法

2024年08月22日29mq0036

我正在尝试创建一个自定义序列化程序方法,用于计算我的 QuizResults 模型中通过和失败的测验数。未通过的测验低于 .7,通过的测验为 .7 或以上。

我希望能够查看 Users 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') 

不幸的是,当我添加这些时,框架中不会出现任何东西。有什么建议么?谢谢。

请您参考如下方法:

您可以使用 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 

您可以复制失败的测验数。