Доступ к объекту запроса в 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 предоставляет контекст для передачи конкретных данных запроса в сериализатор без необходимости переопределения инициализации. Это, вероятно, то, что вы ищете.