如何在django中嵌套的序列化程序中过滤查询集

Joh*_*aff 7 python django django-rest-framework

我有这个代码

# 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
Run Code Online (Sandbox Code Playgroud)

在我看来,我正在覆盖查询集,delete=False但它不适用于嵌套的序列化程序.

Anu*_*dra 12

delete=False在queryset中只会过滤Sample.要在嵌套的序列化程序中过滤查询集,您可以使用serializers.ListSerializer:

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
Run Code Online (Sandbox Code Playgroud)

在这里了解更多


Cli*_*des 6

我并没有完全理解你的问题,但是根据我的想法,你在模型中有一个布尔字段,如果删除对象而不是实际从数据库中删除它,则设置为True(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
Run Code Online (Sandbox Code Playgroud)

上述解决方案应该适合您的要求,但是如果您实现的类似于软删除,那么创建自定义模型管理器似乎更简洁,更模块化.