如何在 Django Rest Framework 中通过 id 查找对象

Ale*_* H. 5 python django django-rest-framework

我不能在 Django Rest Framework 中通过它的 id 拥有对象。我有一个这样的模型:

class BlogPost(models.Model):
    title = models.CharField(max_length=128)    
    content = models.TextField()    
    created = models.DateTimeField(auto_now_add=True) 
Run Code Online (Sandbox Code Playgroud)

然后我写了一个序列化程序:

class BlogPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogPost
        fields = ('title', 'content', 'created')
Run Code Online (Sandbox Code Playgroud)

在我的views.py我有这个:

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
Run Code Online (Sandbox Code Playgroud)

我的网址中有这样的代码:

url(r'^blogpost/$', ListCreateAPIView.as_view(model=BlogPost), name='blogpost-list'), 
Run Code Online (Sandbox Code Playgroud)

但是当我在浏览器http://example.com/blogpost/?blog_post_id=1 中写入时,我拥有所有对象

cor*_*cor 5

如果你真的想使用ListCreateAPIView. 你需要做一些改变:

网址.py

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

视图.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
Run Code Online (Sandbox Code Playgroud)

但我认为 Django Rest Framework 为您的用例提供了更好的基于类的视图,例如RetrieveAPIView. 据我了解,您似乎只想获取一个对象,而这个通用视图是针对对象列表的。


Dan*_*ong 5

就我而言,我偶然发现了这个问题,希望在重写 ModelViewSet 的检索方法时访问对象 id。经过一些研究和实验,我发现对象 id 存储在键中名为 self.kwargs 的字典中'pk'

我正在使用 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']
Run Code Online (Sandbox Code Playgroud)

我希望这个答案能在某个时候帮助另一个孤独的 StackOverflow 流浪者!