我在drf中有一个用户端点
我希望检索用户的lookup_field
类似于@username
,而不是username
如何实现此功能?
我刚刚通过创建一个自定义路由器解决了这个问题
在routers.py
:中
from rest_framework.routers import Route, SimpleRouter
class UserRouter(SimpleRouter):
"""
A router for user to support @username lookup.
"""
routes = [
Route(
url=r'^{prefix}{trailing_slash}$',
mapping={
'get': 'list',
'post': 'create',
},
name='{basename}-list',
detail=False,
initkwargs={'suffix': 'List'}
),
Route(
url=r'^{prefix}/@{lookup}{trailing_slash}$',
mapping={
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
},
name='{basename}-detail',
detail=True,
initkwargs={'suffix': 'Detail'}
),
]
则在urls.py
:中
from .routers import UserRouter
from .apis import UserViewSet
from django.urls import path, include
router = UserRouter()
router.register("", UserViewSet, basename="user")
urlpatterns = [
path("/", include(router.urls)),
]
现在,您可以通过@username
查找获得用户,例如在我的案例中:http://127.0.0.1:8000/api/v1/accounts/@mojixcoder/
您可以这样做:
>>> from django.contrib.auth import get_user_model
>>> User = get_user_model()
>>> Users = User.objects.all()
>>> users_list = list()
>>> for user in Users:
... tmp = '@' + str(user)
... users_list.append(tmp)
>>> users_list
['@a', '@admin', '@test23', '@test24']
,你可以把这个代码一行一行地放在你的视图中
如果您正在使用DRF,那么只需返回users_list作为响应
return Response(users_list, {"Message": f"users list"}, status=HTTP_200_OK)
用于过滤前端的users_list,使其更具交互性;
- VanillaJS将事件侦听器添加到查找字段。过滤结果
- React,添加两个状态,一个用于结果用户,另一个用于查找输入
我能想到的快速搜索算法是:记住这很慢
handleFindUser = (users, searchedUser) => {
let sr = [];
for(let i = 0; i < users.length; i++){
if(users[i].includes(searchedUser)) {
sr.push( users[i].username, searchedUser)
};
};
}, 1000)
return sr;
};
[EDIT]文档https://www.django-rest-framework.org/api-guide/filtering/按url:]筛选用户
在api/views/中
class UsersLookup(generics.ListAPIView):
serializer_class = Users
def get_queryset(self):
"""
This view should return a list of all the purchases for
the user as determined by the username portion of the URL.
"""
username = self.kwargs['username']
return Users.objects.filter(User__username=username)
在api/uls.py 中
re_path('^users/(?P@<username>.+)/$', UsersLookup.as_view()),