Django REST框架:在JSONRenderer

时间:2015-08-20 16:31:24

标签: python django django-rest-framework renderer

我按照this question帮助我知道如何覆盖我的JSONRenderer,但又让我怀疑如何为我重写的JSONRenderer提供一个arg,以便我可以根据需要更改我的'element'名称:< / p>

请查看以下代码段:

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
        data = {'element': data}
        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

我的意图是改变这个'元素'的变量,我想通过arg得到这个原因我试过这个:

renderers.py

中的

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):
    def __init__(self,myarg='teste'):
        self.myarg = myarg

    def render(self, data, accepted_media_type=None, renderer_context=None):
        data = {self.myarg:data}

        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)
views.py

中的

class myViewSet(viewsets.ModelViewSet):
    myrender = EmberJSONRenderer(myarg='abc')
    renderer_classes =  (myrender, BrowsableAPIRenderer, )
    queryset = mymodel.objects.filter(myfilter=2)
    serializer_class = mySerializer
    allowed_methods = ('GET','OPTIONS','HEAD')

这会引发以下类型错误:

  

'EmberJSONRenderer'对象不可调用

您有什么建议我如何将我的视图中的信息直接传递给渲染器作为arg?

1 个答案:

答案 0 :(得分:2)

大家好,这是我找到here并为我工作的方法。我没有通过我的JSONRenderer传递var,而是执行了以下操作:

serializer.py

中的

class mySerializer(serializers.ModelSerializer):
        ...

  class Meta:
            model = ...
            service_name = 'mycustom name'
            fields = ...

而不是我的 renderer.py

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
    service_name = getattr(renderer_context.get('view').get_serializer().Meta, 'service_name', 'objects')


        data = {service_name:{'name_pt':'name', 'keywords':data}}

        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

正如您所见,我使用renderer_context使用getattr方法从视图中获取信息:

getattr(renderer_context.get('view').get_serializer().Meta, 'service_name', 'objects')