Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 939
Alek H. Avatar asked Nov 20 '14 10:11

Alek H.


People also ask

How do I filter Queryset in Django REST framework?

The simplest way to filter the queryset of any view that subclasses GenericAPIView is to override the .get_queryset() method. Overriding this method allows you to customize the queryset returned by the view in a number of different ways.

What is Restapi in Django?

Django REST framework (DRF) is a powerful and flexible toolkit for building Web APIs. Its main benefit is that it makes serialization much easier. Django REST framework is based on Django's class-based views, so it's an excellent option if you're familiar with Django.

What is renderers in Django REST framework?

The rendering process takes the intermediate representation of template and context, and turns it into the final byte stream that can be served to the client. REST framework includes a number of built in Renderer classes, that allow you to return responses with various media types.

How do you use DjangoFilterBackend?

The DjangoFilterBackend class is used to filter the queryset based on a specified set of fields. This backend class automatically creates a FilterSet (django_filters. rest_framework. FilterSet) class for the given fields.


2 Answers

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.

like image 133
cor Avatar answered Oct 31 '22 18:10

cor


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!

like image 24
Daniel Long Avatar answered Oct 31 '22 19:10

Daniel Long