查詢所有
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()方法執行