Доступ к объекту запроса в Viewset и Сериализаторах в Django Rest Framework?
Я хочу получить доступ к объекту запроса в моем Views.py и Serializers.py в DRF. Мой Views.py:
class ProductViewSet(viewsets.ReadOnlyModelViewSet):
"""
This viewset automatically provides `list` and `detail` actions.
"""
queryset = Product.objects.all()
serializer_class = ProductSerializer(context={'request': request})
Мой Serializers.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')
In Serializers.py я получаю ProductSerializer' object has no attribute 'request'
. Также в views.py я получаю NameError: name 'request' is not defined
как получить доступ к объекту запроса? Должен ли я передавать его из представлений в сериализаторы? Также в чем разница между views.py и serializers.py? Как правило, я пишу всю бизнес-логику в Views.py ; здесь также я должен сделать все запросы / фильтры в представлениях или я должен делать их в сериализаторах, или это не имеет значения. Новое в DRF пожалуйста, помогите.
2 ответов
вам не нужно включать request
объект в контексте при передаче общих представлений request
объект контекста сериализатора.
фрагмент исходного кода 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
}
в вашем сериализаторе вы можете открыть the request
объект с помощью .
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
сериализаторы-это способ отображения внешних данных из / в модели (Django или простые классы Python).
представления имеют дело с тем, как будут отображаться данные. Дросселирование, разбиение на страницы, аутентификация управляются представлением. Они также обрабатывают набор данных.
DRF предоставляет контекст для передачи конкретных данных запроса в сериализатор без необходимости переопределения инициализации. Это, вероятно, то, что вы ищете.