1. 程式人生 > >補充:使用django的drf —— 繼承ViewSetMixin的用法和好處

補充:使用django的drf —— 繼承ViewSetMixin的用法和好處

繼承ViewSetMixin,它放在前面(好處,跟某個功能相關的,可以寫在一起),
這樣寫的好處,一個book可以響應兩個get請求
from rest_framework.views import APIView
from rest_framework.viewsets import ViewSetMixin
from app01 import models
from app01 import MySer
from rest_framework.response import Response


class Book(ViewSetMixin, APIView):
    
def get_all(self, request): # 過濾條件,從GET中取出來 response = {'status': 100, 'msg': '查詢成功'} book_list = models.Book.objects.all() # 這個是序列化資料 ser = MySer.BookSerializers(instance=book_list, many=True) # 如果是校驗資料要傳request.data,也就是從前臺傳過來的資料,不能按位置傳參,需要按照關鍵字傳參data=request.data
response['data'] = ser.data return Response(response) def get_one(self, request, pk): response = {'status': 100, 'msg': '查詢成功'} book = models.Book.objects.all().filter(pk=pk).first() if book: ser = MySer.BookSerializers(instance=book, many=False) response[
'data'] = ser.data else: response['status'] = 101 response['msg'] = '您要查詢的資料不存在' return Response(response)
View 檢視層
from app01 import models
from rest_framework import serializers


class BookSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = '__all__'
MySer-序列化元件
from django.db import models


class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)

    def __str__(self):
        return self.name
model 模板層
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from rest_framework import routers
# # 例項化產生一個物件
# router=routers.DefaultRouter()
# router.register('^books',views.Book)
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^books/$', views.Book.as_view({'get':'get_all'})),
    url(r'^books/(?P<pk>\d+)', views.Book.as_view({'get':'get_one'})),
    # url('', include(router.urls)),
url-路由層

這種方法可以快速寫出5個介面

from rest_framework.viewsets import ModelViewSet

-繼承它ModelViewSet
-寫一個檢視類,檢視類中定義兩個變數
class Book(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = MySer.BookSerializers

-路由:(兩條路由):
url(r'^publish', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
url(r'^publish/(?P<pk>\d+)', views.PublishView.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'})),

響應器:(一般不需要配置)
-返回用Response

 

url控制:
三種:
-最原始的
-半自動(必須繼承ViewSetMixin)
-url(r'^books/$', views.Book.as_view({'get':'get_all'})),
-全自動(自動生成路由,必須繼承自ModelViewSet)(不建議用)