【问题标题】:Django Rest sending param in url to querysetDjango Rest 将 url 中的参数发送到查询集
【发布时间】:2021-04-21 00:11:22
【问题描述】:

我正在寻找相关主题的答案,但没有一个有效。所以按照关于filtering的Django Rest Guid,我想添加通过url过滤数据的可能性。

我有我的看法:

class ArtistList(generics.ListAPIView):
    serializer_class = ArtistSerializer

    def get_queryset(self):
        queryset = Artist.objects.all()
        name = self.request.query_params.get('name', None)
        print(name)
        if name is not None:
            queryset = queryset.filter(name=name)
        return queryset

还有我的网址文件:

urlpatterns = [
...
path('artists/<str:name>', ArtistList.as_view(), name='artists'),    

]

当我提供如下网址时:http://localhost:8000/artists?name=A5 它表明该网址不存在。 我也在尝试http://localhost:8000/artists/A5,这会导致返回所有艺术家而不是只有 1 个。

我也在尝试re_path('^artists/(?P&lt;name&gt;.+)/$', ArtistList.as_view(), name='artists'),,就像指南中的示例一样,但我仍然遇到错误。这里有什么问题?

我还有第二个问题。使用参数操作 url 的最佳方法是什么?我的意思是我应该声明第一个 url 用于返回所有对象,而第二个 url 只用于返回特定对象吗?

【问题讨论】:

    标签: django-rest-framework django-urls url-parameters


    【解决方案1】:

    你混淆了两件事:

    1. 你有 path,它通常是主机部分,在 querystring 之前,querystring 以 ? 开头,所以 http://localhost:8000/artists?name=A5 的路径是 @ 987654326@。 URL参数放在self.kwargs;和

    2. 你有 querystringquerystring 是一个在问号之后开始的键值对集合,这些项目存储在request.query_params

    因此,如果您想使用/artists/A5 进行过滤,那么您可以使用:

    # http://localhost:8000/artists/A5
    
    class ArtistList(generics.ListAPIView):
        serializer_class = ArtistSerializer
    
        def get_queryset(self):
            return Artist.objects.filter(name=self.kwargs['name'])

    在这种情况下,您始终需要提供名称,因为您发现不提供名称会返回 HTTP 404 响应。

    如果要使用查询字符串,请将路径更改为:

    # http://localhost:8000/artists?name=A5
    
    urlpatterns = [
        # …,
        path('artists/', ArtistList.as_view(), name='artists'),    
    ]

    然后你像以前一样使用self.query_params。在这种情况下,name=… 部分是不需要的。

    【讨论】:

    • 谢谢,你再次帮助...它有效,但不是localhost:8000/artists?name=A5 我得到localhost:8000/artists/?name=A5 并且删除斜线不起作用
    • @Frendom:这可能是APPEND_SLASH 设置 (docs.djangoproject.com/en/3.1/ref/settings/#append-slash) 或浏览器,因为通常两者应该是等价的。
    • 我不想创建类似的问题,但是如果我们想添加另一个参数 (&) 并使用他对我的数据进行排序呢?
    • @Frendom:然后您再次使用self.query_params.get('otherparam') 获取该参数。它会自动将?...=...&amp;...=...&amp;....=... 解码为类似字典的对象。
    【解决方案2】:

    如果您想使用链接http://localhost:8000/artists?name=A5,只需重命名您的路径:

    urlpatterns = [
    ...
    path('artists', ArtistList.as_view(), name='artists'),    
    
    ]
    

    如果你想使用http://localhost:8000/artists/A5,不要使用query_params,而是使用kwargs:

    name = self.kwargs.get('name', None)
    

    在这两种情况下,如果您想返回单个对象,您可能需要查看详细视图。 (使用 kwargs 通常与详细信息视图相关联)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2014-06-28
      • 2023-04-09
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多