Django Rest 将 url 中的参数发送到查询集

Django Rest sending param in url to queryset

我正在寻找相关主题的答案,但 none 有效。因此,在关于 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

和我的 url 文件:

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

]

当我提供 url 时:http://localhost:8000/artists?name=A5 表明此 url 不存在。 我也在尝试 http://localhost:8000/artists/A5 这导致返回所有艺术家而不是只有 1.

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

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

您混淆了两件事:

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

  2. you have the querystring querystring是从问号后开始的键值对集合,这些项存储在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.<b>kwargs['name']</b>)

在那种情况下,您总是需要提供一个名称,因为您发现没有提供遗嘱,return HTTP 404 响应。

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

# http://localhost:8000/artists?name=A5

urlpatterns = [
    # …,
    path(<b>'artists/'</b>, ArtistList.as_view(), name='artists'),    
]

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

如果你想使用 link 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)

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