項目源碼下載:https://github.com/Cherish-sun/NEWS/tree/master
一、view 視圖(實現新聞類別的api)
drf爲我們提供強大的通用view的功能
主要的幾種view以及他們之間的關係
這其中,還涉及了mixins,主要也分爲5類
建議在做drf的時候,使用ViewSet與mixins方法結合進行開發
• 路由系統是用於接收合適的請求,然後返回相應的響應
• REST框架允許將一系列相關的業務邏輯函數寫在一起,稱爲ViewSet.在其他框架中,相似的
實現也被稱爲’Resources’或者’Controllers’.
• 一個ViewSet類也是一個基礎的View類,不提供任何請求處理函數,如get或post,只提供類似
list和created這樣的方法
• 一個ViewSet類,通過.as_view() method綁定到相應的url上
• 一般不需要在路由管理器中另外註冊視圖函數,只需要註冊這個viewset類就夠了,然後就
會自動幫你處理
• ViewSet
class ViewSet(ViewSetMixin, views.APIView):
繼承自APIView,利用permission_classes, authentication_classes等來控制API策略 。一般都需要重寫此類中的方法
• GenericViewSet
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
GenericViewSet繼承自GenericAPIView,提供了一系列如get_object, get_queryset方法,如果使用此類,需要重寫此類或者與mixin類進
行組合
• ModelViewSet
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
也是繼承自GenericAPIView,通過mixin類,實現了一些具體的操作,.list(), .retrieve(), .create(), .update(), .partial_update(), 和 .destroy
()。
• ReadOnlyModelViewSet
class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet):
也是繼承自GenericAPIView,僅提供只讀操作,.list()和.retrieve()
二、view.py代碼
from rest_framework import viewsets
from .models import Category, Item, Tag, Article, Ad, UserFav, User
from .serilaizes import UserRegSerializer, UserDetailSerializer, UserLoginSerializer, UserSetPasswordSerializer
from .serilaizes import UserFavSerializer, UserFavDetailSerializer, CategoryStringSerializer, \
CategoryPrimaryKeySerializer, CategorySlugSerializer
from .serilaizes import CategorySerializer, ItemSerializer, TagSerializer, AdSerializer, ArticleSerializer, \
Hot_articleSerializer, CategoryitemsSerializer
from rest_framework.decorators import api_view
from rest_framework import mixins
# class CategoryViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
class CategoryViewset(viewsets.ModelViewSet):
"""
list:
GET url: /category/ 分類列表數據
creat:
POST url: /category/ 創建分類詳情
retrieve:
GET url: /category/1/ 獲取分類詳情
update:
PUT url: /category/1/ 修改分類詳情
delete:
DELETE url: /category/1/ 刪除分類詳情
"""
# 查詢對象集
queryset = Category.objects.all()
# 序列化的類名
serializer_class = CategorySerializer
lookup_field = "id"
# class CategoryitemsViewset(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
class CategoryitemsViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
分類列表數據
retrieve:
獲取分類詳情
"""
# 查詢對象集
queryset = Category.objects.all()
# 序列化的類名
serializer_class = CategoryitemsSerializer
lookup_field = "id"
class ItemViewset(viewsets.ModelViewSet):
"""
list:
GET url: /item/ 子類列表數據
creat:
POST url: /item/ 創建子類詳情,返回新生成的子類對像
retrieve:
GET url: /item/1/ 獲取子類詳情,返回子類對像
update:
PUT url: /item/1/ 修改子類詳情,返回子類對像
delete:
DELETE url: /item/1/ 刪除子類詳情,返回空對像
"""
# 用於從此視圖返回對象的查詢器集。
queryset = Item.objects.all()
# filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
# 查詢
# filter_class = ItemFilter
# SearchFilter對應search_fields,對應模糊查詢,也可用關連表的字段進行查詢,但需要二個下劃線連接,如categorys__title
search_fields = ('title', 'categorys__title')
# 用於驗證和反序列化輸入以及序列化輸出的serializer類。通常,您必須設置此屬性,或覆蓋該get_serializer_class()方法。
serializer_class = ItemSerializer
# 應用於執行單個模型實例的對象查找的模型字段。默認爲’pk’。
lookup_field = "id"
四、配置url.py 路由
from django.contrib import admin
from django.urls import path
import article.views as view
from rest_framework.routers import DefaultRouter
# 建立一個路由對象
router = DefaultRouter()
# 將我們的路由註冊到url裏
router.register(r'category', view.CategoryViewset, base_name='category')
router.register(r'categoryitems', view.CategoryitemsViewset, base_name='categoryitems')
router.register(r'item', view.ItemViewset, base_name='item')
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += router.urls
瀏覽器打開http://127.0.0.1:8000/
五、安裝集成自動生成文檔工具–swagger
pip install coreapi
pip install django-rest-swagger
settings.py 中
INSTALLED_APPS = [
...
'rest_framework_swagger',
... ]
urls.py
from rest_framework_swagger.views import get_swagger_view
schema_view = get_swagger_view(title='新聞系統 API')
urlpatterns = [
re_path('^$', schema_view),
…
再刷新下瀏覽器,你會驚喜發現!!!(過程中可能會報錯,本人也是新手一路踩坑,堅持住,遇到bug問度娘,加油 )
六、序列化類三個關鍵字段類型在web api中的使用
1、上面分別寫了分類category、分類子欄目categoryitems、所有子欄目item的API,接下來要實現在item中只要子欄目的主鍵、子欄目的名稱、或者指定的相關字段。
class CategoryStringSerializer(serializers.ModelSerializer):
# 用__str__方法表示只讀關係 items 爲外鍵關係中的related_name
items = serializers.StringRelatedField(many=True)
class Meta:
model = Category
# fields = ('id', 'title','items')
fields = "__all__"
class CategoryPrimaryKeySerializer(serializers.ModelSerializer):
# 用主鍵表示關係
items = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Category
fields = "__all__"
class CategorySlugSerializer(serializers.ModelSerializer):
# 選取關係對象中任意一個字段(唯一標識)表示關係
items = serializers.SlugRelatedField(
many=True,
read_only=True,
slug_field='title'
)
class Meta:
model = Category
fields = "__all__"
要注意related_name要設置成items,外鍵關係和多對多關係都要設置related_name
2、在views.py導入三個類
from .serilaizes import UserFavSerializer, CategoryStringSerializer, \
CategoryPrimaryKeySerializer, CategorySlugSerializer
class CategoryStringitemsViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
分類列表數據
retrieve:
獲取分類詳情
"""
# 查詢對象集
queryset = Category.objects.all()
# 序列化的類名
serializer_class = CategoryStringSerializer
lookup_field = "id"
class CategoryPrimaryKeyitemsViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
分類列表數據
retrieve:
獲取分類詳情
"""
# 查詢對象集
queryset = Category.objects.all()
# 序列化的類名
serializer_class = CategoryPrimaryKeySerializer
lookup_field = "id"
class CategorySlugitemsViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
分類列表數據
retrieve:
獲取分類詳情
"""
# 查詢對象集
queryset = Category.objects.all()
# 序列化的類名
serializer_class = CategorySlugSerializer
lookup_field = "id"
3、將三個類註冊到我們的urls.py中
router.register(r'categoryStringitems', view.CategoryStringitemsViewset, base_name='categoryStringitems')
router.register(r'categoryPrimaryKeyitems', view.CategoryPrimaryKeyitemsViewset, base_name='categoryPrimaryKeyitems')
router.register(r'categorySlugitems', view.CategorySlugitemsViewset, base_name='categorySlugitems')
4、刷新頁面,查看結果