轉自:https://blog.csdn.net/weixin_36646275/article/details/83965621
詳解drf中的ModelViewSet
使用:
# view.py
from rest_framework import viewsets
class PersonalSet(viewsets.ModelViewSet):
queryset = Personal.objects.all()
serializer_class = PersonalSerializer
pagination_class = LargeResultsSetPagination
permission_classes = (IsAuthenticated,)
authentication_classes = (JSONWebTokenAuthentication,)
# urls.py
from django.urls import include, path
from rest_framework import routers
from rest_framework.authtoken import views
from rest_framework_jwt.views import obtain_jwt_token
from okr_rest.views import TestGroupSet, QuarterSet, PersonalSet
router = routers.DefaultRouter()
router.register("test_group", TestGroupSet)
router.register("quarter", QuarterSet, base_name="quarter")
router.register("personal", PersonalSet)
urlpatterns = [
path("", include(router.urls)),
path("api-auth/", include("rest_framework.urls", namespace="rest_framework")),
path("api-token-auth/", views.obtain_auth_token),
path("jwt-auth/", obtain_jwt_token)
說明:
ModelViewSet中默認已經有五個混入類直接封裝好處理各種請求.對應關系已經訪問url如下: DRF默認已經封裝了五種常用的方法,但由於封裝不同需要在訪問的時候注意訪問url(detail是否為true).當然也可以根據自己需要重新各種方法
類名 HTTP方法 說明 detail URL示例
mixins.CreateModelMixin POST 創建數據 False http://localhost/api/personal/
mixins.RetrieveModelMixin GET 檢索數據 True http://localhost/api/personal/30/
mixins.UpdateModelMixin PUT 更新數據 True http://localhost/api/personal/30/
mixins.DestroyModelMixin DELETE 刪除數據 True http://localhost/api/personal/30/
mixins.ListModelMixin GET 獲取數據 False http://localhost/api/personal/
view的用法說明:
class GoodsListViewSet(viewsets.ModelViewSet):
"""
list:
商品列表
read:
商品詳情
create:
增加商品
update:
更改商品
partial_update:
部分更改
delete:
刪除商品
"""
# 必須定義一個默認排序否則會報錯
queryset = Goods.objects.all().order_by('id')
# 分頁
pagination_class = GoodsPagination
serializer_class = GoodsSerializer
# 過濾
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
filter_class = GoodsFilters
# 搜索
search_fields = ('name', 'goods_brief', 'goods_desc')
# 排序
ordering_fields = ('sold_num', 'shop_price')