如何返回与url django rest相同的名字或姓氏的所有用户实例?

时间:2017-07-26 20:33:12

标签: android python rest search django-rest-framework

我正在构建一个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时,无论我在网址中放入什么字符串,都会返回所有用户,而不是仅返回相关的用户。如何解决此问题,以便仅返回具有匹配的名字,姓氏或电子邮件的用户?

2 个答案:

答案 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>调用。