五大接口总结 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(
五大接口总结
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