我正在尝试创建一个自定义序列化方法,该方法计算从我的QuizResults模型中通过和失败的测验的数量。失败的测验低于0.7,通过的测验低于0.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')
不幸的是,添加这些后,在框架中什么也没显示。有什么建议么?谢谢。
最佳答案
您可以在用户模型上使用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
您可以重复此操作以获取失败的测验次数。
关于python - Django Rest Framework自定义序列化器方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37798208/