我按照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?
答案 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')