查询所有
1.创建新clase和url,避免与查询一个功能逻辑混乱。
2.增加many=True,
book_ser=BookSerializer(books,many=True)
urls.py:
path('books/',views.BooksView.as_view())
views.py
class BooksView(APIView):def get(self,request):response_msg = {'status': 100, 'msg': '成功'}books=Book.objects.all()book_ser=BookSerializer(books,many=True) # 序列化多条。 如果一条,不需要写response_msg['data']=book_ser.datareturn Response(response_msg)
新增数据
views.py内的新类BooksView,增加post
# 新增def post(self,request):response_msg = {'status': 100, 'msg': '成功'}# 新增没有instance,只有databook_ser=BookSerializer(data=request.data)# 如果没有data=,会报错。第一个参数是instance# book_ser = BookSerializer(request.data)# 校验字段if book_ser.is_valid():book_ser.save()response_msg['data']=book_ser.dataelse:response_msg['status']=102response_msg['msg']='新增数据校验失败'response_msg['data']=book_ser.datareturn Response(response_msg)
在ser.py重写create 方法
1.需要导入orm Book
2.需要返回
def create(self, validated_data):instance=Book.objects.create(**validated_data)# 正常情况是按下面写的,但是加**打散后是一样,所以直接**# Book.objects.create(name=validated_data.get('name'))return instance
删除一个数据
因为需要pk值,所以放入原来类BookView
def delete(self,request,pk):ret=Book.objects.filter(pk=pk).delete()return Response({'status': 100, 'msg': '删除成功'})
封装Response
1.新建py文件。如utils.py
get_dic用于返回字典
class MyResponse():def __init__(self):self.status=100self.msg='成功'@propertydef get_dic(self):return self.__dict__if __name__ == '__main__':res=MyResponse()print(res.msg)
2.在views.py 导入并使用
注意:return Response(response.get_dic)
仍然使用rest_framework的Response返回,封装的只是字典结构。
from app01.utils import MyResponseclass BooksView(APIView):# 使用封装responsedef get(self, request):response=MyResponse()books = Book.objects.all()book_ser = BookSerializer(books, many=True) # 序列化多条。 如果一条,不需要写response.data = book_ser.datareturn Response(response.get_dic)# 新增def post(self, request):response=MyResponse()# 新增没有instance,只有databook_ser = BookSerializer(data=request.data)# 如果没有data=,会报错。第一个参数是instance# book_ser = BookSerializer(request.data)# 校验字段if book_ser.is_valid():book_ser.save()response.data = book_ser.dataelse:response.status = 102response.msg = '新增数据校验失败'response.data = book_ser.datareturn Response(response.get_dic)
序列化与反序列化
序列化:得到字典,可以理解为查询操作。
反序列化:修改数据,可以理解为修改与新增操作
1.只传data,执行save(),触发create()方法执行
2.传instance和data,执行save(),触发update()方法执行