我正在寻找相关主题的答案,但都没有工作。所以在Django Rest指南中,我想增加通过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
,导致返回所有的艺术家,而不是只有一个。
我也在尝试re_path('^artists/(?P<name>.+)/$', ArtistList.as_view(), name='artists'),
像在指南中的例子,但我仍然得到一个错误。这里出了什么问题?
我还有第二个问题。用参数操作url的最佳方法是什么?我是否应该声明第一个url返回所有对象第二个url只返回特定对象?
你把两件事搞混了:
-
您有路径,这通常是主机的部分,在查询字符串之前,查询字符串以
?
开头,因此http://localhost:8000/artists?name=A5
的路径是artists
。URL参数放在self.kwargs
中;和 -
您有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=…
部分是不需要。
如果您想使用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通常与细节视图联系在一起)