Home > Mobile >  Creating object with generics CreateApiView 'request' required
Creating object with generics CreateApiView 'request' required

Time:02-18

This is my serializer and Viewset, i want to create an instance of Like if someone likes a product (Post request 'products/product:id/like'). But i get an error that 'request' is required.

class LikeSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    product = serializers.PrimaryKeyRelatedField(read_only=True)

    class Meta:
        model = Like
        fields = ('user', 'product',)



class LikeProductApi(generics.CreateAPIView):
    queryset = Like.objects.all()
    serializer_class = LikeSerializer

    def create(self, request, *args, **kwargs):
        product_id = self.kwargs['pk']
        product = ProductInStore.objects.get(id=int(product_id))

        if Like.objects.filter(user=self.request.user, product=product).exists():
            raise ValidationError(_("This user already likes this product"))
        else:
            return super().create(user=self.request.user, product_id=product_id, **kwargs)

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/rest_framework/generics.py", line 190, in post
    return self.create(request, *args, **kwargs)
  File "/Users/jakubstrawa/programming/PythonKuba/api/ecommerce/views.py", line 124, in create
    return super().create(user=self.request.user, product_id=product_id, **kwargs)
TypeError: create() missing 1 required positional argument: 'request'

Do you have any idea why?

CodePudding user response:

You are making a super() call with the wrong parameters, it should be:

def create(self, request, *args, **kwargs):
    product_id = self.kwargs['pk']

    if Like.objects.filter(user=self.request.user, product_id=product_id).exists():
        raise ValidationError(_("This user already likes this product"))
    else:
        return super().create(request, *args, **kwargs)

CodePudding user response:

The issue is how you're calling create()

Try the below:

In the PythonKuba/api/ecommerce/views.py file

    return super().create(request=self.request, product_id=product_id, **kwargs)

At the moment you are sending in the user, not the request

  • Related