Как получить доступ к методу, украшенному декоратором @action представления, унаследованного от класса APIView, в файле urls.py в DRF?

Мне нужно применить различные разрешения к различным методам моего класса View, который наследуется от APIView в приложении DRF. Для достижения этой цели я использую декоратор @action для методов класса View.

Вот код views.py

class UserView(APIView):

    @action(methods=['post'], detail=False, permission_classes=[AllowAny])
    def create(self, request):
        serializer = UserRegSerializer(data=request.data)
        user_service = UserService()
        try:
            serializer.is_valid(raise_exception=True)
            serialized_data = serializer.validated_data
            registered_user = user_service.create_user(serialized_data)
            payload = registered_user.__dict__
            response = ResponseGenerator(payload, constants.SUCCESS_KEY)
        except Exception as e:
            response = ResponseGenerator(e)
        return Response(data={"Response": response.get_custom_response()})

Я не понимаю, как я могу получить доступ к этому методу в моем файле urls.py по шаблону '/user', вот мой код urls.py.

urlpatterns = [
    path('user', UserView.as_view()),
]

Я использовал ChatGPT для ответа на этот вопрос. Он предложил несколько способов использования объекта словаря, переданного {'post':'create'} в методе as_view() View в urls.py следующим образом.

urlpatterns = [
    path('user', UserView.as_view({'post':'create'})),
]

В нем мне было сказано, что key словаря должен быть http метод, используемый для доступа к этому методу по шаблону url, а value словаря должен быть методом, к которому вы хотите получить доступ по данному url.

Но он не работает, и выдает мне следующую ошибку, когда я пытаюсь запустить свой проект после написания этого кода в моем urls.py

TypeError: APIView.as_view() принимает 1 позиционный аргумент, но было задано 2

Я не нашел никакого решения для решения проблемы, с которой я столкнулся, нигде в интернете и в документации django также.

Я рекомендую вам использовать Generic(Some Method)APIView. Потому что он может быть изменен на что-то хорошее для масштабируемости и надежности вашего кода.

  1. Используйте CreateAPIView, вам не нужен декоратор для базовой функции создания.
# views.py
class UserRegView(CreateAPIView):

    serializer_class = UserRegSerializer
    permission_classes = [AllowAny]
  1. Если вам нужна валидация, пишите в функции validate. Ваш Response может быть изменен. Тогда, вы должны изменить вы
  2. .
# serializers.py
class UserRegSerializer(serializers.Serializer):
    somefield_1 = serializers.CharField()
    somefield_2 = serializers.CharField()
    newfield_1 = serializers.IntegerField(read_only=True)  # example

    def validate(self, attrs):

        a = attrs["somefield_1"]
        if a != "otherthing":
            raise ValidationError({"error": "Your error description some case"})
        return attrs

    def create(self, validated_data):
        instance = UserReg.objects.create(**validated_data)

        # Make Logic for instance or just validated_data or custom response whatever you want.
        # If you want to custom response, could write like this simple example.
        return {
            "somefield_1": "test1",
            "somefield_2": "test1",
            "newfield_1": "test1",
        }
  1. Теперь вам не нужен никакой аргумент в as_view().
# urls.py
urlpatterns = [
    path("user_new", UserRegView.as_view()),
]
Вернуться на верх