DirtyHands
DirtyHands

Reputation: 149

filter django serializer data

Many time we access data via serializer directory according to relationship defined in models in Django(1.11.10). How can i set a filter like 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__'

Here i just want to set a filter to fetch only those Jobs which db field is_active=1 in this line like that DaasJobsSerializer(read_only=True,many=True, filter={"is_active":1}) how to do something like this ??

Currently it is giving me all the data without checking is_active, and i dont want to create serializerMethodField for that.. because all methods written earlier.. i am just setting a is_active field later in the tables in db.

Upvotes: 4

Views: 5173

Answers (1)

Thomas Jiang
Thomas Jiang

Reputation: 1323

If you want to do it via serializers you can try overriding the ListSerializer and passing it as a custom list_serializer_class.

class IsActiveListSerializer(serializers.ListSerializer):

    def to_representation(self, data):
        data = data.filter(is_active=1)
        return super().to_representation(data)

In your serializer:

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

Of course this is a specific use-case, you could make a more generalized version of the ListSerializer to:

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)

And then you could sub-class that to make other specific ListSerializers such as:

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

and many others...

Upvotes: 7

Related Questions