Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in Python by (19.9k points)

I am building a Django application that exposes a REST API by which users can query my application's models. I'm following the instructions here.

My Route looks like this in myApp's url.py:

from rest_framework import routers

router = routers.DefaultRouter()    router.register(r'myObjects/(?P<id>\d+)/?$', views.MyObjectsViewSet)

url(r'^api/', include(router.urls)),

My Model looks like this:

class MyObject(models.Model):
    name = models.TextField()

My Serializer looks like this:

class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyObject
    fields = ('id', 'name',)
My Viewset looks like this:
class MyObjectsViewSet(viewsets.ViewSet):
    def retrieve(self,request,pk=None):
        queryset = MyObjects.objects.get(pk=pk).customMyObjectList()
        if not queryset:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        else:
            serializer = MyObjectSerializer(queryset)
            return Response(serializer.data,status=status.HTTP_200_OK)
When I hit /api/myObjects/60/ I get the following error:
base_name argument not specified, and could not automatically determine the name from the viewset, as it does not have a .model or .queryset attribute.
I understand from here that I need a base_name parameter on my route. But from the docs, it is unclear to me what that value of that base_name parameter should be. Can someone please tell me what the route should look like with the base_name

1 Answer

0 votes
by (25.1k points)

The issue with your code is that your viewset named MyObjectViewSet does not include a queryset attribute so you need to pass in the basename attribute in the router.register function. The basename could be anything but the convention is to name it the same as your model.

eg:

router.register(r'person/food', views.PersonViewSet, basename='Person')

Browse Categories

...