django rest framework 解析器元件 介面設計,檢視元件 (2)
阿新 • • 發佈:2018-12-07
1. 使用檢視元件進行介面優化
1.1 使用檢視元件的mixin進行介面邏輯優化
- 匯入mixin
from rest_framework.mixinx import (
ListModelMix,
CreateModelMixin,
DestroyModelMixin,
UpdateModelMixin,
RetrieveModelMixin
)
from rest_framework.generics import GenericAPIView
- 定義序列化類
Class BookSerializer(serializers.ModelSerializer):
class Meta:
Book
fields = ()
extra_kwargs = {"field_name": {"write_only": True}}
- 匯入序列化類
from .app_serializers import BookSerializer
- 定義檢視類
class BookView(ListModelMix, CreateModelMixin, GenericAPIView):
# queryset和serializer_class是固定的寫法
queryset = Book.objects.all()
serializer_class = BookSerializer
def get():
return self.list()
def post():
return self.create()
class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get():
return self.retrieve()
def delete():
return self.destroy()
def put():
return self.update()
注意:單條資料操作的url是這樣的:re_path(r'books/(?P<pk>\d+)/$, views.BookFilterView.as_view())
例項:
1 # class BookView(ListModelMixin,CreateModelMixin,GenericAPIView): 2 # queryset = Book.objects.all() 3 # serializer_class = BookSerializer 4 # def get(self,request, *args, **kwargs): 5 # return self.list(request, *args, **kwargs) 6 # def post(self,request, *args, **kwargs):class類7 # return self.create(request, *args, **kwargs) 8 # 9 # class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView): 10 # queryset = Book.objects.all() 11 # serializer_class = BookSerializer 12 # def put(self,request,*args,**kwargs): 13 # # 更改的時候區分一對多還是多對多14 # return self.update(request,*args,**kwargs) 15 # def get(self,request,*args,**kwargs): 16 # return self.retrieve(request,*args,**kwargs) 17 # def delete(self,request,*args,**kwargs): 18 # return self.destroy(request,*args,**kwargs)
1 class BookSerializer(serializers.ModelSerializer): 2 class Meta: 3 model = Book 4 fields = ('title', 5 'price', 6 'publish', 7 'authors', 8 'author_list', 9 'publish_name', 10 'publish_city' 11 ) 12 # 如過不加會實在頁面顯示關聯的數字 13 extra_kwargs = { 14 'publish': {'write_only': True}, 15 'authors': {'write_only': True} 16 } 17 18 publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name') 19 publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city') 20 21 author_list = serializers.SerializerMethodField() 22 23 def get_author_list(self, book_obj): 24 # 拿到queryset開始迴圈 [{}, {}, {}, {}] 25 authors = list() 26 27 for author in book_obj.authors.all(): 28 authors.append(author.name) 29 30 return authors引入ModelSerializer
1 #re_path(r'books/$', views.BookView.as_view()), 2 #re_path(r'books/(?P<pk>\d+)/$', views.BookFilterView.as_view()),url
這時,會發現程式碼可以繼續優化