Django前後端分離開發-新聞管理系統(三)

項目源碼下載:https://github.com/Cherish-sun/NEWS/tree/master

一、view 視圖(實現新聞類別的api)

drf爲我們提供強大的通用view的功能
主要的幾種view以及他們之間的關係
view關係圖
這其中,還涉及了mixins,主要也分爲5類
mixis
建議在做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()
ModelViewSet關係圖

二、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/

效果圖
category
categoryitems
item

五、安裝集成自動生成文檔工具–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問度娘,加油 )
swagger工具

六、序列化類三個關鍵字段類型在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

items
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、刷新頁面,查看結果
新增三個API

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章