2015-08-20 3 views
3

Я следую this question, которые помогают мне узнать, как переопределить мой JSONRenderer, но возникает другое сомнение в том, как я могу предоставить аргумент моему переопределенному JSONRenderer, чтобы я мог изменить свое имя элемента как я хочу:Django REST Framework: настройка данных dict на JSONRenderer

, пожалуйста, посмотрите на следующий фрагмент кода:

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) 

Мое намерение изменить этот «элемент» для переменной, я хотел бы получить от арг по этой причине я попытался это:

в 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') 

это поднять следующее: TypeError

'EmberJSONRenderer' object is not callable

Есть ли у вас какие-либо предложения, как я могу передать информацию мой взгляд непосредственно на renderer как arg?

ответ

1

Привет всем Это был подход, который я нашел here и работает для меня. Вместо передачи вар через мой JSONRenderer я сделал следующее:

в 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')