我一直在寻找相关主题的答案,但没有一个工作。因此,遵循有关过滤的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<name>.+)/$', ArtistList.as_view(), name='artists'),
按照指南中的示例进行操作,但是仍然出现错误。怎么了
我还有第二个问题。用参数操纵网址的最佳方法是什么?我的意思是我应该声明第一个用于返回所有对象的URL,第二个仅用于指定一个对象的URL?
您正在混淆两件事:
你有路径这部分往往是主机和前查询字符串,在查询字符串开始?
,这样的路径http://localhost:8000/artists?name=A5
是artists
。URL参数放在self.kwargs
;中。和
您拥有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.kwargs['name'])
在这种情况下,您总是需要提供一个名称,因为如您所知,不提供名称将返回HTTP 404响应。
如果要使用查询字符串,请将路径更改为:
# http://localhost:8000/artists?name=A5
urlpatterns = [
# …,
path('artists/', ArtistList.as_view(), name='artists'),
]
然后self.query_params
像以前一样使用。在这种情况下,name=…
被部分不必需的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句