django-rest-framework 返回创建的对象但字段较少

xiaohuochai 阅读:74 2025-06-02 22:19:02 评论:0

在 POST 方法中创建和对象时,如何只返回创建对象的几个字段?这取自文档:

def post(self, request, format=None): 
        serializer = SnippetSerializer(data=request.data) 
        if serializer.is_valid(): 
            serializer.save() 
            return Response(serializer.data, status=status.HTTP_201_CREATED) 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

此处 serializer.data 包含序列化程序中定义的所有字段,但我只想返回其中的一部分。

请您参考如下方法:

好吧,我在这里看到了多种可能性: 首先(我最喜欢的)是将请求对象发送到序列化程序,然后序列化程序将动态选择您想要的字段:

def post(self, request, format=None): 
        serializer = SnippetSerializer(data=request.data,context={'request': request}) 
        if serializer.is_valid(): 
            serializer.save() 
            return Response(serializer.data, status=status.HTTP_201_CREATED) 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

然后在序列化器中:

class SnippetSerializer(serializers.IDontKnow): 
    class Meta: 
        model = YourModel 
        fields = ('url', 'field1','field2','field3') 
        write_only_fields = () 
    def __init__(self, *args, **kwargs): 
        super(SnippetSerializer, self).__init__(*args, **kwargs) 
        if self.context != {}: 
            request = self.context['request'] 
            if request.method == 'POST': 
                self.write_only_fields = {'field1':self.fields['field1'], 'field3':self.fields['field3']} 

这应该使 field1 和 field3 只能写,所以它们不会被返回。

其次,也许更简单的解决方案是定义其他序列化程序,对于 post 方法是唯一的:

def post(self, request, format=None): 
    serializer = PostSnippetSerializer(data=request.data) 
    if serializer.is_valid(): 
        serializer.save() 
        return Response(serializer.data, status=status.HTTP_201_CREATED) 
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

您可以指定您不想重新调整的字段:

 class PostSnippetSerializer(serializers.IDontKnow): 
        class Meta: 
            model = YourModel 
            fields = ('url', 'field1','field2','field3') 
            write_only_fields = ('field1','field3') 

字段 1 和字段 3 不会在响应中返回,

第三种方式,是直接在您的 View 中创建您的响应:

def post(self, request, format=None): 
        serializer = SnippetSerializer(data=request.data) 
        if serializer.is_valid(): 
            serializer.save() 
            results = {'url': serializer.data['url'],'field2':serializer.data['field2']} 
            return Response(results, status=status.HTTP_201_CREATED) 
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

这将只返回 url 和 field2,因此 field1 和 field3 将被保存但不会返回。


标签:Django
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号