Skip to main content
 首页 » 编程设计

python之django rest framework之自定义渲染器

2025年05月04日25qq号

我正在尝试调整现有的 XMLRenderer 以创建一个自定义的 -

class CustomRenderer(renderers.BaseRenderer): 
    """ 
    Renderer which serializes to CustomXML. 
    """ 
 
    media_type = 'application/xml' 
    format = 'xml' 
    charset = 'utf-8' 
 
    def render(self, data, accepted_media_type=None, renderer_context=None): 
        """ 
        Renders *obj* into serialized XML. 
        """ 
        if data is None: 
            return '' 
 
        stream = StringIO() 
 
        xml = SimplerXMLGenerator(stream, self.charset) 
        xml.startDocument() 
        xml.startElement("job id='string1'", {}) 
 
        self._to_xml(xml, data) 
 
        xml.endElement("job") 
        xml.endDocument() 
        return stream.getvalue() 
 
    def _to_xml(self, xml, data): 
        if isinstance(data, (list, tuple)): 
            for item in data: 
                xml.startElement("string2", {}) 
                self._to_xml(xml, item) 
                xml.endElement("string2") 
 
        elif isinstance(data, dict): 
            for key, value in six.iteritems(data): 
                xml.startElement(key, {}) 
                self._to_xml(xml, value) 
                xml.endElement(key) 
 
        elif data is None: 
            # Don't output any value 
            pass 
 
        else: 
            xml.characters(smart_text(data)) 

对于 string1,我希望它从调用它的 View 中获取值。 string1 = 来自 API 中 GET 的主键。

即。如果我调用 http://localhost/API/2345 然后 string1 = 2345

对于 string2,我希望它返回类似于他们在以下帖子中所做的模型名称 -

Adding root element to json response (django-rest-framework)

这是自定义渲染器返回的值,以便可以将 JSON/XML 的根值设置为模型名称。

我已经尝试调整 CustomRenderer 以包含这些行,但是当运行我的 View 时它提示我的 views.py 上的“object() 不带参数”-

if request.method == 'GET': 
    DEV = Trgjob.objects.using('database1').filter(job_id=pk).order_by('job_order') 
    serializer = CustomSerializer(DEV, many=True) 
    return CustomRenderer(serializer.data) 

请您参考如下方法:

看起来您正试图从 View 中返回渲染器实例? 您应该只从 View 返回常规数据,但使用 View 类的 renderer_classes 属性设置渲染器类。

class MyView(APIView): 
    renderer_classes = [CustomRenderer] 
 
    ... 
 
    def get(self, request, pk=None): 
        DEV = Trgjob.objects.using('database1').filter(job_id=pk).order_by('job_order') 
        serializer = CustomSerializer(DEV, many=True) 
        return Response(serializer.data) 

编辑:至于从 View 中获取额外的上下文到渲染器中......你可以通过检查 renderer_context['view'] 来做到这一点,所以这些render() 方法中的行...

view = renderer_context['view'] 
job_id = view.kwargs['job_id']