在序列化器中使用 to_representation,验证删除不满足条件“completed == Total_videos”但获取所有实例的实例,因此请建议解决此问题的解决方案
class LearnerVideoMarkUsCompleteMyCourseSerializer(serializers.ModelSerializer):
course = CourseSerializerForEnrolledCourseService()
total_videos = serializers.SerializerMethodField()
completed = serializers.SerializerMethodField()
id = serializers.UUIDField(source="course.id")
def get_total_videos(self, data):
total_video_count = VideoDetails.objects.filter(
video__coursemodulevideos__module_id__coursesectionmodule__section_id__coursesectiondetails__course=data.course
).count()
return total_video_count
def get_completed(self, data):
progress = data.learner.learner_video_markascomplete.filter(
course=data.course, mark_us_complete=True
).count()
return progress
class Meta:
model = LearnerVideoMarkUsComplete
fields = ("course", "id", "completed", "total_videos")
def validate(self, data):
completed = self.get_completed(data)
total_videos = self.get_total_videos(data)
print("complete", completed)
print("total_videos", total_videos)
if completed == total_videos:
return data
else:
return "not equal"
def to_representation(self, instance):
completed = self.get_completed(instance)
total_videos = self.get_total_videos(instance)
if completed == total_videos:
return super().to_representation(instance)
else:
return None
一种可能的解决方案是使用自定义
ListSerializer
类并重写 to_representation
方法来过滤掉不符合条件的实例。然后,您可以将此类指定为序列化器的 list_serializer_class
类中的 Meta
。这样,您就可以控制嵌套序列化器的输出,而无需修改 validate
方法。
以下是如何实施此解决方案的示例:
class FilteredListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(completed=F('total_videos'))
return super().to_representation(data)
class LearnerVideoMarkUsCompleteMyCourseSerializer(
serializers.ModelSerializer):
course = CourseSerializerForEnrolledCourseService()
total_videos = serializers.SerializerMethodField()
completed = serializers.SerializerMethodField()
id = serializers.UUIDField(source="course.id")
def get_total_videos(self, data):
total_video_count = VideoDetails.objects.filter(
video__coursemodulevideos__module_id__coursesectionmodule__section_id__coursesectiondetails__course=data.course
).count()
return total_video_count
def get_completed(self, data):
progress = data.learner.learner_video_markascomplete.filter(
course=data.course, mark_us_complete=True
).count()
return progress
class Meta:
model = LearnerVideoMarkUsComplete
fields = ("course", "id", "completed", "total_videos")
list_serializer_class = FilteredListSerializer
我希望这对您有帮助。有关更多信息,您可以参考this,它解释了如何在 Django Rest Framework 中过滤嵌套序列化器。