How can I filter a request in a nested serializer in django

I have this code

# Models

class NestedSample(models.Model):
    something = models.CharField(max_length=255)

class Sample(models.Model):
    thing = models.BooleanField()
    nested = models.ForeignKey(NestedSample)

# Serializers

class NestedSampleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = api_models.NestedSample

class SampleSerializer(serializers.HyperlinkedModelSerializer):
    nested = NestedSampleSerializer() # HERE filter delete=false
    nested2 = NestedSample2Serializer() # HERE filter deletefalse

    class Meta:
        model = api_models.Sample

In my opinion, I override the query set for delete=False, but it does not apply to nested serializers.

+4
source share
2 answers

delete=Falsethe request will only have a filter Sample. To filter a query in a nested serializer, you can use serializers.ListSerializeras:

class FilterDeleteListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        data = data.filter(delete=False)
        return super(FilterDeleteListSerializer, self).to_representation(data)

class NestedSampleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = api_models.NestedSample
        list_serializer_class = FilterDeleteListSerializer 

class NestedSample2Serializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = api_models.NestedSample2
        list_serializer_class = FilterDeleteListSerializer 

class SampleSerializer(serializers.HyperlinkedModelSerializer):
    nested = NestedSampleSerializer() # HERE filter delete=false
    nested2 = NestedSample2Serializer() # HERE filter deletefalse

    class Meta:
        model = api_models.Sample

More here

+6
source

, , , , , , (SQL DELETE).

, , , SerializerMethodField. "get_", . .

 class UserSerializer(serializers.ModelSerializer):
    delete_filtered_items = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_delete_filtered_items(self, obj):
        items = Item.objects.filter(user=obj,deleted=False)
        serializer = ItemsSerializer(instance=items, many=True)
        return serializer.data

, , .

+1

Source: https://habr.com/ru/post/1616922/


All Articles