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)
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
1 #re_path(r'books/$', views.BookView.as_view()), 2 #re_path(r'books/(?P<pk>d+)/$', views.BookFilterView.as_view()),
这时,会发现代码可以继续优化
1.2 使用视图组件的view进行接口逻辑优化
- 导入模块
from rest_framework import generics
- 写视图类
class BookView(generics.ListCreateAPIView)
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
1 # class BookView(generics.ListCreateAPIView): 2 # queryset = Book.objects.all() 3 # serializer_class = BookSerializer 4 # 5 # class BookFilterView(generics.RetrieveUpdateDestroyAPIView): 6 # queryset = Book.objects.all() 7 # serializer_class = BookSerializer
1 # path("course/",views.BookView.as_view()), 2 # re_path("course/(?P<pk>d+)/",views.BookFilterView.as_view())
1.3 使用视图组件的viewset进行接口逻辑优化
- 导入模块
from rest_framework.viewsets import ModelViewSet
- 设计url
re_path(r'books/$, views.BookView.as_view({
'get': 'list',
'post': 'create'
})),
re_path(r'books/(?P<pk>d+)/$', views.BookView.as_view({
'get': 'retrieve',
'delete': 'destroy',
'put': 'update'
}))
- 设计视图类
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
1 class BookView(ModelViewSet): 2 queryset = Book.objects.all() 3 serializer_class = BookSerializer
1 re_path("course/$",views.BookView.as_view({ 2 "get":"list", 3 "post":'create', 4 })), 5 re_path("course/(?P<pk>d+)/",views.BookView.as_view({ 6 'get':'retrieve', 7 'put':"update", 8 'delete':"destroy" 9 }))