Python 将URL参数传递给嵌套序列化程序
我有两个序列化程序,其中一个是嵌套的:Python 将URL参数传递给嵌套序列化程序,python,django,api,django-rest-framework,Python,Django,Api,Django Rest Framework,我有两个序列化程序,其中一个是嵌套的: class PaperSerializer(serializers.ModelSerializer): class Meta: model = Paper class AuthorSerializer(serializers.ModelSerializer): papers = PaperSerializer( many=True, read_only=True, sou
class PaperSerializer(serializers.ModelSerializer):
class Meta:
model = Paper
class AuthorSerializer(serializers.ModelSerializer):
papers = PaperSerializer(
many=True,
read_only=True,
source='paper_set'
)
class Meta:
model = Author
我想获得一个作者列表,其中只显示他们发表的论文(模型上存在布尔字段)
我想调用API,比如
/API/v1/authors/?show\u published\u only=true
经过深入研究,我发现可以将上下文从视图集传递到序列化程序:
视图.py
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
filter_fields = (
'show_published_only',
)
def get_serializer_context(self):
return {'request': self.request}
class FilteredPaperSerializer(serializers.ListSerializer):
def to_representation(self, data):
# Get the parameter from the URL
show_published_only = self.context['request'].query_params['show_published_only']
data = data.filter(is_published=show_published_only)
return super(FilteredPaperSerializer, self).to_representation(data)
class AuthorSerializer(serializers.ModelSerializer):
papers = FilteredPaperSerializer(
many=True,
read_only=True,
source='paper_set'
)
class Meta:
model = Author
现在,创建一个新的序列化程序FilteredPaperSerializer
,该序列化程序继承自serializers.ListSerializer
,然后重写to_representation()
方法以过滤查询集:
序列化程序.py
class AuthorViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
filter_fields = (
'show_published_only',
)
def get_serializer_context(self):
return {'request': self.request}
class FilteredPaperSerializer(serializers.ListSerializer):
def to_representation(self, data):
# Get the parameter from the URL
show_published_only = self.context['request'].query_params['show_published_only']
data = data.filter(is_published=show_published_only)
return super(FilteredPaperSerializer, self).to_representation(data)
class AuthorSerializer(serializers.ModelSerializer):
papers = FilteredPaperSerializer(
many=True,
read_only=True,
source='paper_set'
)
class Meta:
model = Author
NB:别忘了将获取的URL参数转换为模型的布尔值或相关数据类型,我在上面的总结中忽略了这一点