【问题标题】:My objects are not getting filtered despite setting the get_queryset function in views.py尽管在 views.py 中设置了 get_queryset 函数,但我的对象没有被过滤
【发布时间】:2019-09-04 14:37:47
【问题描述】:

我想制作一个 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']

序列化器.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 上的代码可以正常工作,但生产网站仍然停留在上述问题中提到的情况。这可能是什么原因?

【问题讨论】:

  • 你正在尝试哪个网址?
  • /api/blog/9 存在 id 为 9 的博客文章。并且所有博客文章都被显示,即与 /api/blog 的输出相同
  • /api/blog/9/ ... 以 / 结尾(斜线)
  • 不行,还是不行

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


【解决方案1】:

如果您使用RetrieveUpdateDeleteAPIView 类,您可能不想使用lookup_field='blog_id',而是打算使用lookup_url_kwarg='blog_id'。您还应该删除您的 get_queryset() 方法,因为视图会为您处理。

当您更改此设置时,您的视图将使用 lookup_url_kwarg 从 URL r'^blog/(?P&lt;blog_id&gt;\d+)/$' 检索正确的值,并将尝试使用 BlogModel 上的 id 字段进行查找。

另外,如果您对 /api/blog/9/ 的请求返回一个列表,那么您的 url 配置一定是不正确的,因为 RetrieveUpdateDeleteAPIView 类不返回该 JSON,它只会从您的模型返回一个类似于字典的对象.您的博客列表 url 是否配置为 r'^blog/$'? (最后缺少 $ 可能是原因)

【讨论】:

  • look_up_kwarg 的知识至关重要。此外,正如您预测的那样, r'^blog/$' 中的 $ 丢失了。虽然代码在 localhost 中运行,但在生产网站中无法运行,这可能是什么原因?
  • @RJ_SU 你有关于生产错误的更多信息吗?是不是同样的错误?
  • 我终于想通了!这一切都表明服务器没有因我在 git 存储库上所做的代码更改而重新启动。实际上,我使用的重启命令不正确或工作不正常。确切的命令完成了这项工作。
【解决方案2】:

我认为你应该删除 BlogRetrieveView 的 lookup_fieldget_queryset() 并将 url 更改为 url(r'^blog/(?P&lt;pk&gt;\d+)/$',BlogRetrieveView.as_view())

【讨论】:

  • 整个方法在 django 的最新版本中运行。但是我的网站正在使用 django 1.10 和 python 2.7 。它一定有其他方法可以做到这一点
  • 我的错,它的 django 1.11 本身
猜你喜欢
  • 2018-10-24
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
相关资源
最近更新 更多