我想制作一个api,从已发布的博客文章列表中获取博客的详细视图。为了解决这个问题,我使用get_queryset()过滤器来解决这个问题,但它只是回放所有列表,即没有过滤器工作。
我使用了如下所示的代码:
models.朋友
class BlogModel (models.Model) :
heading = models.CharField(max_length=254)
blog = models.TextField()
author = models.CharField(max_length=254)
views.朋友
class BlogRetrieveView(generics.RetrieveUpdateDeleteAPIView):
serializer_class=BlogListSerializer
queryset=BlogModel.objects.all()
lookup_field='blog_id'
def get_queryset(self,*args, **kwargs):
return BlogModel.objects.filter(
blog__id=self.kwargs['blog_id']
serialize认识.朋友
class BlogListSerializer(serializers.ModelSerializer):
class Meta:
model = BlogModel
fields = '__all__'
URLs.朋友
url(r'^blog/(?P<blog_id>\d+)/$',BlogRetrieveView.as_view()),
我得到以下输出:
This shows 1 out of 7 blog post shown in a list.显然,过滤器没有应用。
编辑1:根据给定的建议,我在localhost上的代码工作,但生产网站仍然停留在上述问题中提到的情况。它背后的原因是什么?
如果你正在使用RetrieveUpdateDeleteAPIView
类,你可能不想使用lookup_field='blog_id'
而是意味着使用lookup_url_kwarg='blog_id'
。你也应该删除你的get_queryset()
方法,因为视图将为你处理。
当你更改它时,你的视图将使用r'^blog/(?P<blog_id>\d+)/$'
从URL lookup_url_kwarg
中检索正确的值,它将使用BlogModel上的id
字段尝试查找。
此外,如果您对/api/blog/9/
的请求返回一个列表,那么您的url配置必须是不正确的,因为RetrieveUpdateDeleteAPIView
类不返回该JSON,它只返回模型中数据的字典对象。您的博客列表网址是否配置为r'^blog/$'
? (最后可能缺少$ $)
我想你应该删除BlogRetrieveView的lookup_field
和get_queryset()
并将网址更改为url(r'^blog/(?P<pk>\d+)/$',BlogRetrieveView.as_view())