1. 程式人生 > >django rest framework 解析器元件 介面設計,檢視元件 (2)

django rest framework 解析器元件 介面設計,檢視元件 (2)

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):
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)
class類
 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

 

這時,會發現程式碼可以繼續優化