一:序列化返回多个模型类对象:
1;视图
class BookView(GenericAPIView):
# 定义类属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
# :序列化返回多个模型类对象
def get(self, request):
# 1:获取查询集
books = self.get_queryset()
# 2: 获取序列化对象
serializer = self.get_serializer(
instance=books,
many=True
)
# 3: 序列化返回
return Response(data=serializer.data)
2:问题:
2.1:books = self.get_queryset()怎么知道我要查询哪个查询集的呢?
查看get_queryset源码:这个函数返回类属性(我们自己定义的),并且,判断这个查询集是否存在,如果之前存在了,则重新查询数据库,保证查询到的数据是最新的。
2.2: serializer = self.get_serializer:我怎么知道要用那个序列化器来序列化呢??
查看get_serializers源码:
二:反序列化新建单一资源:
class BookView(GenericAPIView):
# 定义类属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
# 序列化新建单一资源
def post(self, request):
# 1:获取序列化对象
serializer = self.get_serializer(
data=request.data
)
if not serializer.is_valid():
return Response(
data= {"errmsg": "参数错误"},
status= status.HTTP_400_BAD_REQUEST
)
# 2: 保存
serializer.save()
return Response(
data=serializer.data
)
测试:
三:序列化返回单一资源:
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializers
lookup_field = "pk"
lookup_url_kwarg = "pk"
# 1:序列化返回单一资源
def get(self, request, pk):
# 1: 获取查询集
book = self.get_object()
# 2: 获取序列化对象
serializer = self.get_serializer(instance=book)
# 3:返回响应
return Response(
data= serializer.data
)
问题:self.get_object()提取的依据是什么??
(1)、查询集;—— 默认类属性cls.queryset
(2)、过滤依据字段;—— 默认类属性cls.lookup_field(默认是pk,如果是pk,这个可以不用写)
(3)、获取字段值 —— 通过类属性cls.lookup_url_kwarg指定的正则分组名提取过滤字段的值(默认是pk对应的值,如果是根据pk也可以不用写)
四:反序列化单一资源:(全更新和不全更新)
全更新:
# 2:反序列化更新(全更新)
def put(self, request, pk):
# 获取更新对象
book = self.get_object()
# 获取反序列化对象
serializer = self.get_serializer(instance=book, data=request.data)
if not serializer.is_valid():
return Response({
"errmsg": "反序列化失败"
})
serializer.save()
return Response(
data=serializer.data
)
部分更新:
def patch(self, request, pk):
# 获取更新对象
book = self.get_object()
# 获取反序列化对象
serializer = self.get_serializer(instance=book, data=request.data, partial=True)
if not serializer.is_valid():
return Response({
"errmsg": "反序列化失败"
})
serializer.save()
return Response(
data=serializer.data
)
五:反序列化删除单一对象:
# 3:删除单一资源
def delete(self, request, pk):
# 获取查询集对象
book = self.get_object()
# 调用delete方法删除
book.delete()
return Response(data=None, status=status.HTTP_200_OK)