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 返回所有对象,然后声明第二个只返回特定对象吗?
您混淆了两件事:
你有 path 这部分通常是主机和 querystring 之前,querystring 以?
,所以 http://localhost:8000/artists?name=A5
的路径是 artists
。 URL参数放在self.kwargs
;和
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 通常与详细信息视图相关联)
我正在寻找相关主题的答案,但 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 返回所有对象,然后声明第二个只返回特定对象吗?
您混淆了两件事:
你有 path 这部分通常是主机和 querystring 之前,querystring 以
?
,所以http://localhost:8000/artists?name=A5
的路径是artists
。 URL参数放在self.kwargs
;和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 通常与详细信息视图相关联)