1. 程式人生 > 資訊 >特斯拉:德國柏林超級工廠每 10 小時就能生產一輛 Model Y,而大眾卻需要 30 小時

特斯拉:德國柏林超級工廠每 10 小時就能生產一輛 Model Y,而大眾卻需要 30 小時

APIView 

from rest_framework.views import APIView

  類屬性

renderer_classes,
parser_classes

  get方法,post方法,delete方法寫法跟之前的View一樣,只不過request物件變成了新的request丟下,比之前的View多了三大認證和全域性異常處理

  程式碼

class BookView(APIView):
    def get(self, request):
        book_list = Book.objects.all()
        ser = BookSerializers(instance=book_list, many=True)
        
return Response(ser.data, headers={'name': 'zys'}) def post(self, request): ser = BookSerializers(data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "新增成功", "data": ser.data}) return Response({"code": 101, "msg": "新增出錯
", "err": ser.errors}) class BookDataView(APIView): def get(self, request, pk): book = Book.objects.all().filter(pk=pk).frist() ser = BookSerializers(instance=book) return Response(ser.data) def put(self, request, pk): book = Book.objects.all().filter(pk=pk).first() ser
= BookSerializers(instance=book, data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "修改成功", "data": ser.data}) return Response({"code": 101, "msg": "修改出錯", "err": ser.errors}) def delete(self, request, pk): Book.objects.filter(pk=pk).delete() return Response({"code": 100, "msg": "刪除成功", })

GenericAPIView

   繼承了APIView  ,多了屬性和方法

from rest_framework.generics import GenericAPIView

  屬性

    -queryset = None
    -serializer_class = None
    -lookup_field = 'pk'  # 查詢單條,分組分出來的引數,轉換器物件引數的名字
    -filter_backends   # 過濾排序功能會用它
    -pagination_class  # 分頁功能

  方法

    -get_queryset()  # 獲取要序列化的資料,後期可能會重寫
    -get_object()    # 通過lookup_field查詢的
    -get_serializer()  # 使用它序列化
    -get_serializer_class() # 返回序列化類 ,後期可能重寫

  程式碼

class BookView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    def get(self, request):
        
        obj = self.get_queryset()
        
        ser = self.get_serializer(instance=obj, many=True)
        return Response(ser.data)

    def post(self, request):
       
        ser = self.get_serializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({"code": 100, "msg": "新增成功", "data": ser.data})
        return Response({"code": 101, "msg": "新增出錯", "err": ser.errors})


class BookDataView(GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    def get(self, request, pk):
        
        obj = self.get_object()
        
        ser = self.get_serializer(instance=obj)
        return Response(ser.data)

    def put(self, request, pk):
        
        obj = self.get_object()
        
        ser = self.get_serializer(nstance=obj, data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({"code": 100, "msg": "修改成功", "data": ser.data})
        return Response({"code": 101, "msg": "修改出錯", "err": ser.errors})

    def delete(self, request, pk):
       
        self.get_object().delete()
        return Response({"code": 100, "msg": "刪除成功", })

5個檢視擴充套件類(不是檢視類,沒有整合APIView,需要配合GenericAPIView)

  新增,查詢單條,查詢所有,修改,刪除

from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin

  程式碼

class PublishView(GenericAPIView,CreateModelMixin,ListModelMixin):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers
    def get(self, request):
        return super().list(request)

    def post(self, request):
        return super().create(request)


class PublishDataView(GenericAPIView,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin):
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers
    def get(self, request, *args, **kwargs):
       return super().retrieve(request,*args, **kwargs)

    def put(self, request, *args, **kwargs):
        return super().update(request,*args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return super().destroy(request, *args, **kwargs)

9個檢視子類---》是檢視類

from rest_framework.generics import CreateAPIView, ListAPIView, DestroyAPIView, RetrieveAPIView, UpdateAPIView, \
    ListCreateAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView

  程式碼

class PublishView(ListCreateAPIView):  # 查詢所有和新增介面
    # class PublishView(CreateAPIView):  # 新增介面
    # class PublishView(ListAPIView):  # 查詢所有介面
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers


# class PublishDataView(RetrieveUpdateDestroyAPIView):  # 查詢單條,刪除,修改
# class PublishDataView(RetrieveAPIView):  # 查詢單條
# class PublishDataView(DestroyAPIView):  # 刪除
# class PublishDataView(UpdateAPIView):  # 修改
# class PublishDataView(RetrieveDestroyAPIView):  # 查詢單條和刪除
# class PublishDataView(RetrieveUpdateDestroyAPIView):  # 查詢單條和更新
class PublishDataView(UpdateAPIView, DestroyAPIView):  # 更新和刪除
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

 通過ViewSet寫檢視類

from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet

  ModelViewSet

# 繼承了5個試圖擴充套件類+GenericViewSet(ViewSetMixin, generics.GenericAPIView)
# ViewSetMixin控制了路由寫法變了
# class PublishView(ModelViewSet):  # 修改路由,5個介面
#     queryset = Publish.objects.all()
#     serializer_class = PublishSerializers

  ReadOnlyModelViewSet

class PublishView(ReadOnlyModelViewSet):  # 修改路由,只讀,查所有,查單個
    queryset = Publish.objects.all()
    serializer_class = PublishSerializers

  關於路由的兩種書寫方法

    第一種

router = SimpleRouter()
router.register('publish', views.PublishView, 'publish')
urlpatterns = [
    path('admin/', admin.site.urls),
    # path('publish/', views.PublishView.as_view()),
    # path('publish/<int:pk>', views.PublishDataView.as_view()),

    path('books/', views.BookView.as_view()),
    path('books/<int:pk>', views.BookDataView.as_view()),
]
# 把路由加入到urlpatterns的列表中
# 第一種方法
# router.urls 他會自動生成 publish/  publish/<int:pk>print(router.urls)urlpatterns += router.urls  # 兩個列表相加

  第二種

  需匯入include

from django.urls import path, include
from app01 import views
from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('publish', views.PublishView, 'publish')
urlpatterns = [
    path('admin/', admin.site.urls),
    # path('publish/', views.PublishView.as_view()),
    # path('publish/<int:pk>', views.PublishDataView.as_view()),

    path('books/', views.BookView.as_view()),
    path('books/<int:pk>', views.BookDataView.as_view()),
    path('api/v1/', include(router.urls))  # 前面可以加相加的東西 例如 'api/v1/'
]

   關於路由書寫的一些總結

# ViewSet=APIView+ViewSetMixin
# GenericViewSet=GenericAPIView+ViewSetMixin
from rest_framework.viewsets import ViewSet,GenericViewSet
from rest_framework.viewsets import ViewSetMixin

  以後只要想自動生成路由,必須繼承ViewSetMixin及其子類,之前的寫法可以沿用,只是如果要自動生成路由可以選擇繼承ViewSet,GenericViewSet