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

У меня есть класс моей модели:

class Subscription(models.Model):
    email = models.EmailField(max_length=250, unique=True)

    def __str__(self):
        return self.email

и мой вид:

class SubscriptionView(APIView):
    queryset = Subscription.objects.all()

    def post(request):
        email = request.data.get('email')
        print(email)
        save_email = Subscription.objects.create(email=email)
        save_email.save()

        return Response(status=status.HTTP_201_CREATED)

Моя модель принимает только 1 поле, которое является email. Не знаю, почему я продолжаю получать 'TypeError: post() принимает 1 позиционный аргумент, но было задано 2'

Благодарю за любую помощь!

Ваш post является методом, поэтому первым параметром будет self:

class SubscriptionView(APIView):
    queryset = Subscription.objects.all()

    def post(self, request):
        email = request.data.get('email')
        Subscription.objects.create(email=email)
        return Response(status=status.HTTP_201_CREATED)

It is however quite seldom that one implements a post method itself. Usually you work for example with a CreateAPIView [drf-doc], and one can let the serializer, etc. handle all the work.

post является методом экземпляра класса SubscriptionView, при вызове метода экземпляра Python автоматически передает object reference этого класса. Поэтому вам необходимо получить ссылку на этот объект в вашем методе экземпляра.

Вы не получили ссылку на объект в вашем методе сообщения, поэтому интерпретатор Python показывает вам:

TypeError: post() takes 1 positional argument but 2 were given

but 2 were given Потому что Python вызывает сообщение типа post(SubscriptionView(), request), но вы получаете только request

Вы можете получить object reference, используя любое имя, но использование self является стандартным.

class SubscriptionView(APIView):
    queryset = Subscription.objects.all()

    def post(self, request):
        email = request.data.get('email')
        Subscription.objects.create(email=email)
        return Response(status=status.HTTP_201_CREATED)
Вернуться на верх