ken*_*gcc 11 python django django-rest-framework
我正在使用Django Rest Framework的默认路由器并尝试自定义我的链接.
如何设置如下所示的排列方式:
/myModels/dosomething(并在API Root视图中列出)/myModels/addModel?name=abc&address=xyz
Views.py
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
Run Code Online (Sandbox Code Playgroud)
urls.py
router = routers.DefaultRouter(trailing_slash=True)
router.register(r'mymodels', views.MyModelViewSet)
Run Code Online (Sandbox Code Playgroud)Bur*_*ing 13
让我展示如何使用ViewSet和router:
根据defaultrouter,您的视图集需要声明类中的视图.
我举一个关于用户api的例子,并指导您如下:
class UserViewSet(viewsets.ViewSet):
"""Userviewset
Restful Structure:
| URL style | HTTP Method | URL Nanme | Action Function |
|----------------|-------------|-------------|-----------------|
| /users | GET, POST | user-list | user_list |
| /users/<email> | GET, DELETE | user-detail | user_detail |
"""
# Router class variables
lookup_field = 'email'
lookup_value_regex = '[\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}'
# Viewsets class variables
#queryset = User.objects.all()
def list(self, request):
"""GET - Show all users"""
print request.version
api_result = user_list.lists_all_users()
return Response(api_result)
def create(self, request):
"""POST - Add new user"""
api_result = user_list.create_new_user(request.data)
return Response(api_result)
def retrieve(self, request, email=None):
"""GET - Show <email> user"""
api_result = user_detail.retrieve_the_user(email)
return Response(api_result)
def partial_update(self, request, email=None):
return Response()
def destroy(self, request, email=None):
"""DETELE - Delete <email> user"""
api_result = user_detail.destroy_the_user(email)
return Response(api_result)
Run Code Online (Sandbox Code Playgroud)
当我完成包含基本restful api的UserViewSet时,我注册router:
router = routers.SimpleRouter(trailing_slash=False)
router.register(prefix=r'users', viewset=UserViewSet, base_name='user')
Run Code Online (Sandbox Code Playgroud)
因此会产生相应的网址:
list并create与相应的网址:/usersretrieve,partial_update并destroy与相应的网址:/users/<email>假设您需要添加更多自定义网址,您应该使用list_route或detail_route扩展视图集:
@list_route(methods=['post'])
def login(self, request):
"""POST - login by user"""
...
Run Code Online (Sandbox Code Playgroud)
所以新动作是与相应的url:
login是与相应的网址: /users/login我希望它可以帮到你.
您可以通过在视图上使用@detail_route或@list_route装饰器将更多端点添加到默认路由器.
@list_route将创建一个新的端点/myModel/new-route/,而@detail_route将创建新的端点/myModel/<id-of-model>/new-route/
但是,如果要完全替换Default路由器提供的端点,则应考虑编写自定义路由器.
DRF的文档定制路由器的很好的解释,以及一个样定制路由器的例子是有.
| 归档时间: |
|
| 查看次数: |
9125 次 |
| 最近记录: |