如何删除序列化器中的实例

问题描述 投票:0回答:1

在序列化器中使用 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
python-3.x django django-rest-framework django-serializer
1个回答
0
投票

一种可能的解决方案是使用自定义

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 中过滤嵌套序列化器。

© www.soinside.com 2019 - 2024. All rights reserved.