¿Accediendo al objeto de solicitud en el conjunto de vistas y serializadores en Django Rest Framework?

Quiero acceder al objeto de solicitud en mi Views.py y Serializers.py en DRF. Mis vistas.py:

class ProductViewSet(viewsets.ReadOnlyModelViewSet): """ This viewset automatically provides `list` and `detail` actions. """ queryset = Product.objects.all() serializer_class = ProductSerializer(context={'request': request}) 

Mis Serializadores.py:

 class ProductSerializer(serializers.HyperlinkedModelSerializer): get_sr_price = serializers.SerializerMethodField('get_sr_price_func') def get_sr_price_func(self, obj): return self.request.user ?? class Meta: model = Product fields = ( 'title', 'slug', 'product_stores', 'get_sr_price') 

En Serializers.py obtengo ProductSerializer' object has no attribute 'request' . También en views.py obtengo NameError: name 'request' is not defined

¿Cómo accedo al objeto de solicitud? ¿Tengo que pasarlo de vistas a serializadores? Además, ¿cuál es la diferencia entre views.py y serializers.py? Generalmente escribo toda la lógica de negocios en Views.py; aquí también debo hacer todas las consultas / filtros en las vistas o debo hacerlos en serializadores o no hace una diferencia. Nuevo en DRF por favor ayuda.

No es necesario incluir el objeto de request en el contexto, ya que las vistas genéricas pasan el objeto de request al contexto del serializador.

Fragmento de código fuente de DRF:

 # rest_framework/generics.py def get_serializer_context(self): """ Extra context provided to the serializer class. """ return { 'request': self.request, # request object is passed here 'format': self.format_kwarg, 'view': self } 

En su serializador, puede acceder al objeto de request utilizando el atributo .context .

El diccionario de context se puede usar dentro de cualquier lógica de campo de serializador, como un .to_representation() personalizado de .to_representation() , accediendo al atributo self.context .

 class ProductSerializer(serializers.HyperlinkedModelSerializer): get_sr_price = serializers.SerializerMethodField('get_sr_price_func') def get_sr_price_func(self, obj): return self.context['request'].user # access the request object 

Los serializadores son la forma en que los datos externos se asignan desde / a los modelos (Django o clases de Python simples).

Las vistas tratan sobre cómo se mostrarán los datos. La regulación gestiona la regulación, la paginación y la autenticación. También manejan el conjunto de datos.

DRF proporciona un contexto para pasar datos específicos de la solicitud al serializador sin tener que redefinir el init. Esto es probablemente lo que estás buscando.