如何在Django Rest Framework中过滤嵌套的序列化器?
在Django Rest Framework中,当一个序列化器嵌套在另一个序列化器中时,如何过滤它?
我的过滤器被强加在DRF视图集中,但是当您从另一个序列化器内部调用序列化器时,嵌套序列化器的视图集将永远不会被调用,因此嵌套结果看起来是未经过滤的。
我尝试在原始视图集上添加过滤器,但是它似乎无法过滤嵌套结果,因为嵌套结果被称为单独的预提取查询。(您看到嵌套的序列化程序是反向查找。)
是否可以在嵌套序列化程序本身中添加get_queryset()覆盖(将其移出视图集),以在其中添加过滤器?我也尝试过,没有运气。
这是我尝试过的方法,但似乎没有被调用:
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta: model = Questionnaire def get_queryset(self): query = super(QuestionnaireSerializer, self).get_queryset(instance) if not self.request.user.is_staff: query = query.filter(user=self.request.user, edition__hide=False) return query
你可以子类化ListSerializer并覆盖该to_representation
方法。
默认情况下,该to_representation
方法调用data.all()
嵌套的查询集。因此,你实际上需要data = data.filter(**your_filters)
在调用该方法之前进行制作。然后,你需要将子类化的ListSerializer
添加为嵌套序列化器的meta上的list_serializer_class
。
- 子类ListSerializer,覆盖
to_representation
,然后调用super
- 将子类ListSerializer添加为
list_serializer_class
嵌套Serializer
上的meta
这是你的示例的相关代码。
class FilteredListSerializer(serializers.ListSerializer): def to_representation(self, data): data = data.filter(user=self.request.user, edition__hide=False) return super(FilteredListSerializer, self).to_representation(data) class EditionSerializer(serializers.ModelSerializer): class Meta: list_serializer_class = FilteredListSerializer model = Edition class QuestionnaireSerializer(serializers.ModelSerializer): edition = EditionSerializer(read_only=True) company = serializers.StringRelatedField(read_only=True) class Meta: model = Questionnaire
转载:http://codingdict.com/questions/4908