Django REST Framework: настройка словаря данных на JSONRenderer

Я следую этому вопросу, который помогает мне узнать, как переопределить мой JSONRenderer, но происходит у меня еще одно сомнение в том, как я могу предоставить аргумент моему переопределенному 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')

это вызовет следующую ошибку типа:

Объект EmberJSONRenderer не вызывается

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


person ePascoal    schedule 20.08.2015    source источник


Ответы (1)


Привет всем, это был подход, который я нашел здесь и работает для меня. Вместо того, чтобы передавать переменную через мой 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')
person ePascoal    schedule 20.08.2015
comment
Спасибо! у меня это сработало, мне нужно было передать разные функции для метода рендеринга в зависимости от класса. - person montxe; 28.11.2019