AttributeError Объект 'UserViewset' не имеет атрибута 'action'

Я использую django rest framework, и я пытаюсь настроить метод get_parsers в моем UserViewset, я посмотрел документацию, и нашел похожий случай использования с классами разрешения в docs, и я попытался настроить get_parsers следующим образом

class UserViewset(viewsets.ModelViewSet):
serializer_class = UserSerializer

# Redefine get_parsers, so that only the update methods have form-data media type
def get_parsers(self):
    if self.action == 'update' or self.action == 'partial_update':
        parser_classes = [FormParser, MultiPartParser]
    else:
        parser_classes = [JSONParser]
    return [parser() for parser in parser_classes]

но я продолжаю получать ошибку: AttributeError at /api/auth/users/: 'UserViewset' object has no attribute 'action' Я попробовал вариант использования, найденный в документации, и он отлично сработал. Что я делаю не так?

Вы должны привести свой набор представлений к .as_view(), например;

path('users/', UserViewset.as_view(), name='users'),

Итак, благодаря fb.com/laidani.basset @bdbd и @willem-van-onsem и u/vikingvynotking, я смог исправить это с помощью 2 различных решений:

  • Первый - переопределить initialize_request следующим образом, идея в том, чтобы установить парсер запроса на экземпляр того парсера, который вы хотите; обратная сторона - когда вы используете swagger или любой документ API, он не будет различать парсеры методов и будет только один парсер, в моем случае это JSONParser:

    .
     def initialize_request(self, request, *args, **kwargs):
    
         request = super().initialize_request(request, *args, **kwargs)
         print(request.method)
         if request.method in ['PUT', 'PATCH']:
             request.parsers = [FormParser(), MultiPartParser()]
         else:
             request.parsers = [JSONParser()]
    
         self.action = self.action_map.get(request.method.lower())
         return request
    
  • Второе решение - переопределить initialize_request так, чтобы self.action вызывался перед вызовом запроса, а затем использовать метод get_parsers по своему усмотрению, в этом случае swagger будет различать парсеры каждого метода:

     def initialize_request(self, request, *args, **kwargs):
         self.action = self.action_map.get(request.method.lower())
         return super().initialize_request(request, *args, **kwargs)
    
Вернуться на верх