ModelViewSet django-rest框架中的lookup字段



我在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()),

最新更新