Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将URL参数传递给嵌套序列化程序_Python_Django_Api_Django Rest Framework - Fatal编程技术网

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参数转换为模型的布尔值或相关数据类型,我在上面的总结中忽略了这一点