Maurinostroza
Maurinostroza

Reputation: 115

More than one value in url on Django Rest Framework

I'm having this issue with Django Rest Framework and i don't get how to solve it. So, i want to pass more than 1 value through my API URL like this:

urls.py

    url(r'^api/resource/(?P<value1>\w+)/resourcetwo/(?P<value2>[\w-]+)/$', views.Example.as_view()),

In views.py i have this:

class Example(APIView):
    def get_object(self, *args, **kwargs):
        try:
            value1 = kwargs.get('value1')
            value2 = kwargs.get('value1')
            return Model.objects.get(value1=value1)
        except Model.DoesNotExist:
            raise NotFound

    def get(self, request, value1, value2, format=None):
        queryset = self.get_object(value1, value2)
        serializer = ModelSerializer(queryset)
        return Response(serializer.data)

The issue is that i don't even get to my get_object because i have the following error from rest_framework.views:

file "../env/lib/python3.8/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs) 

TypeError: get() got an unexpected keyword argument 'value1'

I have tried with the following configuration also:

 path('api/resource/<int:value1>/resourcetwo/<int:value2>', views.Example.as_view()),

 def get_object(self, value1, value2):
        try:
            #... rest of the func.

But i have the same error from rest_framework views, so how this should be implemented?

Thanks for your help!

Upvotes: 0

Views: 477

Answers (1)

theguru42
theguru42

Reputation: 3378

your method signature for get is incorrect. And you don't have to pass anything to get_object method.

change your code to:

class Example(APIView):
    def get_object(self):
        try:
            value1 = self.kwargs.get('value1')
            value2 = self.kwargs.get('value1')
            return Model.objects.get(value1=value1)
        except Model.DoesNotExist:
            raise NotFound

    def get(self, request, *args, **kwargs):
        instance = self.get_object()
        serializer = ModelSerializer(instance)
        return Response(serializer.data)

Upvotes: 1

Related Questions