在 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
您可以子类化列表序列化器并覆盖to_representation
方法。
默认情况下to_representation
方法调用data.all()
在嵌套查询集上。所以你实际上需要做data = data.filter(**your_filters)
在调用该方法之前。然后,您需要将子类 ListSerializer 添加为嵌套序列化器元上的 list_serializer_class 。
- 子类ListSerializer,覆盖
to_representation
然后调用超级
- 添加子类 ListSerializer 作为元
list_serializer_class
在嵌套序列化器上
这是您的示例的相关代码。
class FilteredListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(user=self.context['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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)