首页 > 解决方案 > 过滤 django 序列化程序数据

问题描述

很多时候,我们根据 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}) 如何做这样的事情??

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

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


如果您想通过序列化程序来实现,您可以尝试覆盖ListSerializer并将其作为 custom 传递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)

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

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

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


推荐阅读