day100
上节回顾
1 APIView流程
2 序列化组件(restframework)
1 # 自定义序列化组件
class BookSerializers(serializers.Serializer):
title=serializers.CharField()
price=serializers.CharField()
publishDate=serializers.DateField()
# 针对一对多
publish=serializers.CharField(source="publish.name")
publish_email=serializers.CharField(source="publish.email")
# 针对多对多
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
data=[]
for i in obj.authors.all():
temp=[]
temp.append(i.pk)
temp.append(i.name)
data.append(temp)
return data
# ModelSerializer序列化组件
class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields="__all__"
publish = serializers.CharField(source="publish.name")
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
data=[]
for i in obj.authors.all():
temp=[]
temp.append(i.pk)
temp.append(i.name)
data.append(temp)
return data
2 5个接口
"books" GET:获取所有数据
POST:添加一条数据
"book/1" GET:获取单条数据
DELETE:删除一条数据
PUT/PATCH:更新一条数据
3
(1) 功能之序列化:
book_list = Book.objects.all()
ps = BookSerializers(book_list, many=True)
ps.data
book_obj=Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj,many=False)
(2) 校验字段与操作记录(ModelSerializer拥有)
# 添加数据
bs=BookSerializers(data=request.data)
if bs.is_valid(): #校验字段接口
bs.save() # 生成记录接口
return Response(bs.data) # 序列化接口
# 更新数据
bs=BookSerializers(data=request.data,instance=book_obj)
if bs.is_valid(): #校验字段接口
bs.save() #更新记录接口
return Response(bs.data) # 序列化接口
3 视图
(1)
class AuthorView(APIView):
def get():
pass
def post():
pass
class AuthorDetailView(APIView):
def get():
pass
def delete():
pass
def put():
pass
(2) class AuthorView(CreateModelMixin,ListModelMixin,generics.GenericAPIView,):
queryset=Author.objects.all
serializer_class=AuthorSerializers
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class AuthorDetailView(DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin,generics.GenericAPIView,):
queryset = Author.objects.all
serializer_class = AuthorSerializers
def get(self,request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def put(self,request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def delete(self,request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
(3) class AuthorView(generics.ListCreateAPIView):
queryset=Author.objects.all
serializer_class=AuthorSerializers
class AuthorDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = Author.objects.all
serializer_class = AuthorSerializers
(4) class AuthorModelView(ModelViewSet):
queryset=Author.objects.all()
serializer_class=AuthorSerializers
ViewSetMixIn
第4种的url要传参数,注意 如:
url(r'^publishs/$',views.PublishView.as_view({"get":"list","post":"create"})),
url(r'^publishs/(?P<pk>\d+)/$',views.PublishView.as_view({"put":"update","get":"retrieve","delete":"destroy"}))
4 解析器
class APIView:
parser_classes = api_settings.DEFAULT_PARSER_CLASSES