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)