五大接口总结
get
群查加单查
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
many = False
user_obj = models.Book.objects.filter(pk=pk, is_delete=False)
else:
many = True
user_obj = models.Book.objects.filter(is_delete=False)
if not user_obj:
return Response({
'status': 1,
'msg': '请求资源不存在'
})
user_der = serializers.V2Bookserializers(instance=user_obj, many=many)
return Ress(results=user_der).fanhui()
post
单增加群增
def post(self, request, *args, **kwargs):
request_data = request.data
# 单增
if isinstance(request_data, dict):
many = False
# 群增
elif isinstance(request_data, list):
many = True
else:
raise exceptions.ValidationError('数据格式不正确')
book_der = serializers.V2Bookserializers(data=request_data, many=many)
book_der.is_valid(raise_exception=True)
book_result = book_der.save()
book_data = serializers.V2Bookserializers(instance=book_result, many=many).data
return Ress(results=book_data).fanhui()
delete
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk:
delete_obj = models.Book.objects.filter(pk=pk, is_delete=False).update(is_delete=True)
else:
pks = request.data.get('pks')
delete_obj = models.Book.objects.filter(pk__in=pks, is_delete=False).update(is_delete=True)
if delete_obj:
return Response({
'status': 0,
'msg': '删除成功'
})
return Response({
'status': 1,
'msg': '删除失败'
})
注:
删除接口并不会走序列化,而且一般返回空
put
# 整体单改
def put(self, request, *args, **kwargs):
request_data = request.data
pk = kwargs.get('pk')
try:
book_obj = models.Book.objects.filter(pk=pk, is_delete=False).first()
if not book_obj:
raise exceptions.ValidationError('xxx')
except:
return Response({
'status': 1,
'msg': '数据错误'
})
# 需要进行update时,要同时传入instance和data
book_ser = serializers.V2Bookserializers(instance=book_obj, data=request_data)
book_ser.is_valid(raise_exception=True)
new_book_obj = book_ser.save()
return Response({
'status': 0,
'msg': 'ok',
'results': serializers.V2Bookserializers(instance=new_book_obj).data
})
patch
局部修改(单体和所有)
views.py
def patch(self, request, *args, **kwargs):
# request_data = request.data
# pk = kwargs.get('pk')
# try:
# book_obj = models.Book.objects.filter(pk=pk, is_delete=False).first()
# if not book_obj:
# raise exceptions.ValidationError('xxx')
# except:
# return Response({
# 'status': 1,
# 'msg': '数据错误'
# })
# # partial默认为False,意为只要参加反序列化的字段,没有表明required为False的字段都是必填的
# # partial为True,所有字段反序列化时都不是必填的
# book_ser = serializers.V2Bookserializers(instance=book_obj, data=request_data, partial=True)
# book_ser.is_valid(raise_exception=True)
# new_book_obj = book_ser.save()
# return Response({
# 'status': 0,
# 'msg': 'ok',
# 'results': serializers.V2Bookserializers(instance=new_book_obj).data
# })
request_data = request.data
pk = kwargs.get('pk')
pks = []
update_data = []
if pk and isinstance(request_data, dict):
pks = [pk, ]
update_data = [request_data, ]
elif not pk and isinstance(request_data, list):
for dic in request_data:
pks.append(dic.pop('pk'))
update_data.append(dic)
else:
return Response({
'status': 1,
'msg': '数据格式错误'
})
if not pks or not update_data:
return Response({
'status': 1,
'msg': '数据错误'
})
book_obj_list = []
for i in pks:
book_obj = models.Book.objects.filter(pk=i, is_delete=False).first()
if not book_obj:
return Response({
'status': 1,
'msg': '数据错误'
})
book_obj_list.append(book_obj)
book_der = serializers.V2Bookserializers(instance=book_obj_list, data=update_data, many=True, partial=True)
print(type(book_der))
book_der.is_valid(raise_exception=True)
new_objs = book_der.save()
return Response({
'status': 0,
'msg': 'ok',
'results': serializers.V2Bookserializers(instance=new_objs, many=True).data
})
serializers.py中
首先群增群改都是由ListSerializer来完成的,但是ListSerializer提供了create方法,没有提供update方法,需要我们自己重写
class BookListSerializers(serializers.ListSerializer):
def update(self, instance, validated_data):
for index, obj in enumerate(instance):
self.child.update(obj, validated_data[index])
return instance
class V2Bookserializers(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = ('name', 'img', 'price', 'authors', 'publish', 'publish_name', 'get_author')
...
list_serializer_class = BookListSerializers
我们要在序列化类中添加list_serializer_class = BookListSerializers不然走的还是ListSerializer