Alek H.
Alek H.

Reputation: 129

How to find object by its id in Django Rest Framework

I can't have object by its id in Django Rest Framework. I have a such model:

class BlogPost(models.Model):
    title = models.CharField(max_length=128)    
    content = models.TextField()    
    created = models.DateTimeField(auto_now_add=True) 

Then I write a serializer:

class BlogPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        fields = ('title', 'content', 'created')

In my views.py I have this:

class BlogPostListFilter(dajngo_filter.FilterSet):
     blog_post_id = django_filters.NumerFilter(name = 'id')

     class Meta:
          model = BlogPost
          fiields = ['blog_post_id']


class BlogPostList(generics.ListCreateAPIView):
     queryset = BlogPost.objects.all()
     serializer_class = BlogPostSerializer
     permission_classes = (AllowAny,)
     filter_class = BlogPostListFilter
     paginate_by = 100

And such code in my urls:

url(r'^blogpost/$', ListCreateAPIView.as_view(model=BlogPost), name='blogpost-list'), 

But when I write in browser http://example.com/blogpost/?blog_post_id=1 I have all objects

Upvotes: 8

Views: 21745

Answers (2)

Daniel Long
Daniel Long

Reputation: 1667

In my case, I stumbled upon this question looking to access the object id while overriding a ModelViewSet's retrieve method. After some research and experimentation, I discovered that the object id is stored in a dictionary called self.kwargs in the 'pk' key.

I am using djangorestframework==3.11.0.

class MealItemViewSet(viewsets.ModelViewSet):
    queryset =MyModel.objects.all()
    serializer_class = serializers.MyModelSerializer

    def retrieve(self, request, *args, **kwargs):
        # The Primary Key of the object is passed to the retrieve method through self.kwargs
        object_id = self.kwargs['pk']

I hope this answer helps another forlorn StackOverflow wanderer at some point!

Upvotes: 5

cor
cor

Reputation: 3393

If you really want to use ListCreateAPIView. You need to make some changes:

urls.py:

url(r'^blogpost/(?P<post_id>\w+)$', views.BlogPostList.as_view(),name='blogpost-list'),

views.py

class BlogPostList(generics.ListCreateAPIView):
   serializer_class = BlogPostSerializer
   permission_classes = (AllowAny,)
   filter_class = BlogPostListFilter
   paginate_by = 100

   def get_queryset(self):
      queryset = BlogPost.objects.filter(pk=self.kwargs['post_id'])
      return queryset

But I think that Django Rest Framework provides better Class Based Views for your use case, such as RetrieveAPIView. As far as I understand, it seems that you just want to get an object, and this generic view is for a list of objects.

Upvotes: 6

Related Questions