【问题标题】:How to structure a url to filter if a query string parameter exists in Django如果Django中存在查询字符串参数,如何构造一个url来过滤
【发布时间】:2021-01-16 11:45:38
【问题描述】:

我正在尝试通过传递到 url 中的查询字符串的参数来过滤我的“帖子”模型。如果没有给出这个参数,我希望 url 只返回所有帖子。

据我(显然不正确)的理解,它应该如何工作:

urls.py:

path('feed?category=<str:category>', views.Posts.as_view())

views.py:

def Posts(APIView):
    def get(self, request, **kwargs):
        if self.kwargs['category']:
            queryset = Post.objects.filter(category_name = self.kwargs['category'])
        else:
            queryset = Post.objects.all()

使用上面的代码,我希望通过请求 url .../feed,视图会将查询集设置为所有帖子,但是如果我输入 url .../feed?category=x,它只会返回此类别的帖子。

目前,该程序不这样运行。我将如何完成此功能?

谢谢,格雷

【问题讨论】:

  • path 只检查 URL 的 path? 之后的部分是 not 路径,即 查询字符串,所以你不能在路径中过滤。

标签: django api url filter django-rest-framework


【解决方案1】:

path只检查URL的路径?之后的部分不是路径,即query string [wiki],所以你可以不要在路径中过滤。查询字符串存储在request.GET 一个类似字典的对象中。

因此,您将路径定义为:

path(<b>'feed/'</b>, views.PostView.as_view())

在视图中,您可以使用以下内容进行过滤:

def PostView(APIView):
    model = Post

    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)
        if 'category' in self.request.GET:
            return queryset.filter(category_name=self.request.GET['category'])
        return queryset

注意:在 Django 中,基于类的视图 (CBV) 通常具有 …View 后缀,以避免与模型名称发生冲突。 因此,您可以考虑将视图类重命名为 PostView,而不是 Posts

【讨论】:

  • 如果查询字符串是字典项,那么我不能使用 self.kwargs['category'] 访问 'category' 变量吗?
  • 是否可以改为使用: if 'category' in self.request.kwargs ?
  • @GraeCumming: 不,request 对象有 no .kwargs,只有视图有。 self.kwargs 不包含查询字符串中的项目,仅包含 path 变量。
猜你喜欢
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
相关资源
最近更新 更多