我正在构建一个django rest api作为Android应用程序的后端。我在android客户端实现了一个搜索功能,它应该传递查询字符串;可以是后端的名字,姓氏,两者或电子邮件,用于搜索用户模型以查找任何匹配的实例,并返回它们以显示在客户端的回收站视图中。
我的网址构建方式客户端看起来像这样:
@GET("users/search/{name}")
Call<List<User>> searchUsers(@Path("name") String name);
此端点的urls.py类似于此服务器端:
url(r'^search/(?P<username>.+)/$', user_views.UserSearchListView.as_view(), name="user_search"),
映射到url的视图如下所示:
class UserSearchListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('firstName', 'lastName', 'email')
当我使用邮递员测试我的API时,无论我在网址中放入什么字符串,都会返回所有用户,而不是仅返回相关的用户。如何解决此问题,以便仅返回具有匹配的名字,姓氏或电子邮件的用户?
答案 0 :(得分:2)
看起来您没有正确使用filters.SearchFilter
。
# views.py
class UserSearchListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (filters.SearchFilter,)
search_fields = ('firstName', 'lastName', 'email')
# urls.py
url(r'^search/$', user_views.UserSearchListView.as_view(), name="user_search"),
然后要请求搜索用户,您需要提供网址:
/users/search/?search=@example.com
哪个会返回firstName,lastName或email包含字符串"@example.com"
的所有用户。查看SearchFilter文档,了解有关其工作原理以及如何自定义搜索和过滤的更多信息。 http://www.django-rest-framework.org/api-guide/filtering/#searchfilter
答案 1 :(得分:1)
这是因为您没有使用filters.SearchFilter
所需的正确网址结构。根据{{3}},您需要将搜索字段作为查询参数提供,如下所示:
http://example.com/api/users?search=russell
所以你的urls.py应该是这样的:
url(r'^search$', user_views.UserSearchListView.as_view(), name="user_search"),
应该使用search?search=<name>
调用。