增
# 单增,群增
def post(self, request, *args, **kwargs):
'''
单增:前台提交字典
群增:前台提交列表套字典
'''
request_data = request.data
if isinstance(request_data, dict):
# 第一步,把前台提交的字典丢进序列化工具
book_ser = serializer.Book_modelserializer(data=request_data)
if book_ser.is_valid(): # 判断数据是否合法
book_obj = book_ser.save() # 合法即保存
return APIResponse(results=serializer.Book_modelserializer(book_obj).data, msg='saved')
return APIResponse(results=book_ser.errors,msg='valid error', status=2000)
elif isinstance(request_data, list):
book_ser = serializer.Book_modelserializer(data=request_data, many=True)
if book_ser.is_valid(raise_exception=True): # 判断数据是否合法
book_obj_list = book_ser.save() # 合法即保存
return APIResponse(results=serializer.Book_modelserializer(book_obj_list, many=True).data, msg='saved')
return APIResponse(results=book_ser.errors,msg='valid error', status=2000)
else:
return APIResponse(msg='data error', status=2000)
删
# 单删与群删 前台发送delete请求时触发
def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
# print(request.data)
print('pk', pk)
print('pks', request.data.get('pks'))
if pk: # 如果有pk,则为单删 url: /books/pk/ 单删
pks = [pk]
else: # 群删为delete请求 并且携带数据包,数据包中有键为pks的数据,值为一个个主键值
pks = request.data.get('pks')
if not pks:
return APIResponse(status=2000, msg='pk error')
results = models.Books.objects.filter(is_delete=0, pk__in=pks).update(is_delete=1)
if not results:
return APIResponse(msg=f'delete failed {results}', status=2000)
return APIResponse(msg='deleted', results=pks)
查
def get(self, request, *args, **kwargs): # 单查或多查数据
pk = kwargs.get('pk')
# print(pk)
if pk: # 单查
book_obj = models.Books.objects.filter(pk=pk, is_delete=0).first()
if not book_obj: # 查不到
return APIResponse(2001, '单查error')
else: # 单查查到了
# 将查到的数据完成序列化(指定many=false):
book_data = serializer.Book_modelserializer(book_obj, many=False).data
return APIResponse(results=book_data)
else: # 多查
book_query = models.Books.objects.filter(is_delete=0).all()
# 完成序列化
book_list_data = serializer.Book_modelserializer(book_query, many=True).data
return APIResponse(results=book_list_data)
改
单整体改、群整体改
def put(self, request, *args, **kwargs):
"""
单整体改:前台提交字典,接口 /books/(pk)/
群整体改:前台提交列表套字典,接口 /books/,注每一个字典都可以通过pk
"""
pk = kwargs.get('pk')
request_data = request.data
if pk: # 单改
try:
book_obj = models.Book.objects.get(pk=pk)
except:
return APIResponse(1, 'pk error')
# 修改和新增,都需要通过数据,数据依旧给data,修改与新增不同点,instance要被赋值为被修改对象
book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data)
book_ser.is_valid(raise_exception=True)
book_obj = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
else: # 群改
if not isinstance(request_data, list) or len(request_data) == 0:
return APIResponse(1, 'data error', http_status=400)
# [{pk:1,...}, {pk:3,...}, {pk:100,...}] => [obj1, obj3, obj100] + [{...}, {...}, {...}]
# 要考虑pk对应的对象是否被删,以及pk没有对应的对象
# 假设pk3被删,pk100没有 => [obj1] + [{...}]
# 注:一定不要在循环体中对循环对象进行增删(影响对象长度)的操作
obj_list = []
data_list = []
for dic in request_data:
# request_data可能是list,单内部不一定是dict
try:
pk = dic.pop('pk')
try:
obj = models.Book.objects.get(pk=pk, is_delete=False)
obj_list.append(obj)
data_list.append(dic)
except:
pass
except:
return APIResponse(1, 'data error', http_status=400)
book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True)
book_ser.is_valid(raise_exception=True)
book_obj_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)
单局部改、群局部改
# 单局部改、群局部改
def patch(self, request, *args, **kwargs):
"""
单整体改:前台提交字典,接口 /books/(pk)/
群整体改:前台提交列表套字典,接口 /books/,注每一个字典都可以通过pk
"""
pk = kwargs.get('pk')
request_data = request.data
if pk:
try:
book_obj = models.Book.objects.get(pk=pk)
except:
return APIResponse(1, 'pk error')
# 局部修改就是在整体修改基础上设置partial=True,将所有参与反序列化字段设置为required=False
book_ser = serializers.BookModelSerializer(instance=book_obj, data=request_data, partial=True)
book_ser.is_valid(raise_exception=True)
book_obj = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj).data)
else: # 群改
if not isinstance(request_data, list) or len(request_data) == 0:
return APIResponse(1, 'data error', http_status=400)
# [{pk:1,...}, {pk:3,...}, {pk:100,...}] => [obj1, obj3, obj100] + [{...}, {...}, {...}]
# 要考虑pk对应的对象是否被删,以及pk没有对应的对象
# 假设pk3被删,pk100没有 => [obj1] + [{...}]
# 注:一定不要在循环体中对循环对象进行增删(影响对象长度)的操作
obj_list = []
data_list = []
for dic in request_data:
# request_data可能是list,单内部不一定是dict
try:
pk = dic.pop('pk')
try:
obj = models.Book.objects.get(pk=pk, is_delete=False)
obj_list.append(obj)
data_list.append(dic)
except:
pass
except:
return APIResponse(1, 'data error', http_status=400)
book_ser = serializers.BookModelSerializer(instance=obj_list, data=data_list, many=True, partial=True)
book_ser.is_valid(raise_exception=True)
book_obj_list = book_ser.save()
return APIResponse(results=serializers.BookModelSerializer(book_obj_list, many=True).data)