尽管在 views.py 中设置了 get_queryset 函数,但我的对象没有被过滤
My objects are not getting filtered despite setting the get_queryset function in views.py
我想创建一个 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:根据给定的建议,我在本地主机上的代码可以正常工作,但生产网站仍然停留在上述问题中提到的情况。背后的原因是什么?
我认为您应该删除 BlogRetrieveView 的 lookup_field
和 get_queryset()
,并将网址更改为 url(r'^blog/(?P<pk>\d+)/$',BlogRetrieveView.as_view())
如果您使用 RetrieveUpdateDeleteAPIView
class,您可能不想使用 lookup_field='blog_id'
,而是打算使用 lookup_url_kwarg='blog_id'
。您还应该删除 get_queryset()
方法,因为视图会为您处理。
当您更改此设置时,您的视图将使用 lookup_url_kwarg
从 URL r'^blog/(?P<blog_id>\d+)/$'
检索正确的值,并将尝试使用 id
字段进行查找在 BlogModel 上。
此外,如果您对 /api/blog/9/
的请求是 return 列表,那么您 url 配置一定不正确,因为 RetrieveUpdateDeleteAPIView
class 不return 即 JSON,它只会 return 模型中数据的类似字典的对象。您的博客列表 url 是否配置为 r'^blog/$'
? (最后缺少 $ 可能是原因)
我想创建一个 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:根据给定的建议,我在本地主机上的代码可以正常工作,但生产网站仍然停留在上述问题中提到的情况。背后的原因是什么?
我认为您应该删除 BlogRetrieveView 的 lookup_field
和 get_queryset()
,并将网址更改为 url(r'^blog/(?P<pk>\d+)/$',BlogRetrieveView.as_view())
如果您使用 RetrieveUpdateDeleteAPIView
class,您可能不想使用 lookup_field='blog_id'
,而是打算使用 lookup_url_kwarg='blog_id'
。您还应该删除 get_queryset()
方法,因为视图会为您处理。
当您更改此设置时,您的视图将使用 lookup_url_kwarg
从 URL r'^blog/(?P<blog_id>\d+)/$'
检索正确的值,并将尝试使用 id
字段进行查找在 BlogModel 上。
此外,如果您对 /api/blog/9/
的请求是 return 列表,那么您 url 配置一定不正确,因为 RetrieveUpdateDeleteAPIView
class 不return 即 JSON,它只会 return 模型中数据的类似字典的对象。您的博客列表 url 是否配置为 r'^blog/$'
? (最后缺少 $ 可能是原因)