Django Rest将url中的参数发送给queryset



我正在寻找相关主题的答案,但都没有工作。所以在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只返回特定对象?

你把两件事搞混了:

  1. 您有路径,这通常是主机的部分,在查询字符串之前,查询字符串以?开头,因此http://localhost:8000/artists?name=A5的路径是artists。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=…部分是不需要

如果您想使用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通常与细节视图联系在一起)

相关内容

  • 没有找到相关文章

最新更新