1 序列化组件
(1)原生序列化
1)导入
from django.core.serializers import serializer
2)使用
class BookView(APIView):
def get(self, request):
books = Book.objects.all()
#序列化
serialized_data = serialize("json", books)
#返回序列化结果
return HttpResponse(serialized_data)
(2)序列化组件
1)导入
from rest_framework import serializers
2) 定义序列化类BookSerializer(字段名必须与model中定义的字段名一样,否则会报错)
class BookSerializer(serializers.Serializer):
title= serializers.CharField(max_length=32)
price=serializers.CharField(max_length=32)
#显示出来的是Id (多对一,外键字段)
publish=serializers.CharField(max_length=32)
publish_name = serializers.CharField(max_length=32, source="publish.name", read_only=True)
# 多对多字段(该字段名 与下面的get_后面的字段名必须一样)
authors_list = serializers.SerializerMethodField()
#多对多字段的处理(get_是规定写法,后面的名同上authors_list)
def get_authors_list(self,book_obj):
authors=list()
for author in book_obj.authors.all():
authors.append(author.name)
return authors
3) 定义views.py
#1 首先导入2)步中自定义的序列化类
class BookView(APIView):
def get(self,request):
#2获取数据
books=Book.object.all()
#3序列化 (BookSerializer是引入的序列化类)
serialized_data=BookSerializer(books,many=True)
#4返回序列化结果
return Response(serialized_data.data)
(3)通过drf的序列化组件进行GET接口设计
- 定义views.py
class BookFilterView(APIView):
def get(self,request,nid):
book_obj=-Book.objects.get(pk=nid)
ser_data=BookSerializers(book_obj,many=False)
print('ser_data',ser_data)
return Response(ser_data.data)
2 视图组件(mixins)
视图组件是用来优化接口逻辑的
(1) 导入
from rest_framework.mixins import(
ListModelMixin,
CreateModelMixin,
RetrieveModelMixin,
DestoryModelMixin,
UpdateModelMixin
)
from rest_framework.generics import GenericAPIView
(2) 定义序列化类
同上定义的序列化类一样
(3) 定义view.py
class BookView(ListModelMixin, CreateModelMixin, GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
return self.list(request)
def post(self, request):
return self.create(request)
class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
return self.retrieve(request)
def put(self, request):
return self.update(request)
def delete(self, request):
return self.destroy(request)
3 generic
(1) 导入
from rest_framework import generic
(2)使用
#查看添加
class BookView(generic.ListCreateAPIView):
#queryset 与 serializer_class 名字是固定的
queryset = Book.objects.all()
serializer_class=BookSerializer
#更改删除 查看单条数据
class BookView(generic.RetricveUpdateDestroyAPIView):
queryset= Book.objects.all()
serializer_class=BookSerializer
4 viewset
(1) 导入
from rest_framework.viewsets import ModelViewSet
(2) 使用
class BookView(ModelViewSet):
queryset = Book.object.all()
serializer_class=BookSerializer
(3)在url中配置
urlpatterns=[
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',
'put':'update',
'delete':'destory'
}))
]