首页 文章

过滤django序列化数据

提问于
浏览
0

很多时候我们根据Django(1.11.10)中模型中定义的关系通过序列化程序目录访问数据 . 如何设置像fetch-only is_active = 1这样的过滤器 .

class DaasJobsSerializer(serializers.ModelSerializer):
    class Meta:
        model = DaasJobs
        fields = '__all__'

class DaasScheduleSerializer(serializers.ModelSerializer):
    jobs = DaasJobsSerializer(read_only=True,many=True)

    class Meta:
        model = DaasSchedule
        fields = '__all__'

在这里,我只想设置一个过滤器,只获取那行中db字段is_active = 1的那些作业 DaasJobsSerializer(read_only=True,many=True, filter={"is_active":1}) how to do something like this ??

目前它给我所有的数据而不检查is_active,我不想为此创建serializerMethodField ..因为之前写的所有方法..我只是稍后在db中的表中设置一个is_active字段 .

1 回答

  • 0

    如果您想通过序列化程序执行此操作,可以尝试重写 ListSerializer 并将其作为自定义list_serializer_class传递 .

    class IsActiveListSerializer(serializers.ListSerializer):
    
        def to_representation(self, data):
            data = data.filter(is_active=1)
            return super().to_representation(data)
    

    在你的序列化器中:

    class DaasJobsSerializer(serializers.ModelSerializer):
        class Meta:
            model = DaasJobs
            fields = '__all__'
            list_serializer_class = IsActiveListSerializer  # import it here
    

    当然这是一个特定的用例,您可以将ListSerializer的更通用版本设置为:

    class FilteredListSerializer(serializers.ListSerializer):
    
        filter_kwargs = {}
    
        def to_representation(self, data):
            if not self.filter_kwargs or not isinstance(self.filter_kwargs, dict):
                raise TypeError(_('Invalid Attribute Type: `filter_kwargs` must be a of type `dict`.'))
            data = data.filter(**self.filter_kwargs)
            return super().to_representation(data)
    

    然后你可以对其进行子类化以制作其他特定的ListSerializers,例如:

    class IsActiveListSerializer(FilteredListSerializer):
         filter_kwargs = {'is_active': 1}
    

    和许多其他人......

相关问题