尽管在views.py中设置了get_queryset函数,但我的对象没有被过滤

时间:2019-04-14 12:21:03

标签: python python-2.7 filter django-rest-framework django-1.11

我想制作一个api,以从已发布的博客文章列表中获取博客的详细视图。为了解决这个问题,我正在使用get_queryset()过滤器来解决此问题,但这只是回馈所有列表,即没有过滤器起作用。

我使用了如下所示的代码:

models.py

class BlogModel (models.Model) :
    heading = models.CharField(max_length=254)
    blog = models.TextField()
    author = models.CharField(max_length=254)

views.py

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']

serializers.py

class BlogListSerializer(serializers.ModelSerializer):
    class Meta:
        model = BlogModel
        fields = '__all__'

urls.py

 url(r'^blog/(?P<blog_id>\d+)/$',BlogRetrieveView.as_view()),

我得到以下输出:

This shows 1 out of 7 blog post shown in a list. 显然,没有应用过滤器。

编辑1:根据给定的建议,我在localhost上的代码可以正常工作,但生产网站仍陷于上述问题中提到的情况。背后的原因是什么?

2 个答案:

答案 0 :(得分:0)

我认为您应该删除BlogRetrieveView的lookup_fieldget_queryset()并将URL更改为url(r'^blog/(?P<pk>\d+)/$',BlogRetrieveView.as_view())

答案 1 :(得分:0)

如果您正在使用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/$'? (末尾缺少$可能是原因)