【问题标题】:Django REST Framework: Customize data dict on JSONRendererDjango REST Framework:自定义 JSONRenderer 上的数据字典
【发布时间】:2015-08-20 16:31:23
【问题描述】:

我关注this question,它帮助我了解如何覆盖我的 JSONRenderer,但我又怀疑如何为我覆盖的 JSONRenderer 提供一个 arg 以便我可以根据需要更改我的“元素”名称:

请看下面的sn-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 直接传递给渲染器吗?

【问题讨论】:

    标签: python django django-rest-framework renderer


    【解决方案1】:

    大家好,这是我找到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')
    

    【讨论】:

    • 谢谢!它对我有用,我需要根据类为渲染方法传递不同的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2013-01-15
    • 2018-05-04
    • 1970-01-01
    • 2018-10-26
    • 2014-08-19
    相关资源
    最近更新 更多