ModelSerializer序列化(Apiview)


url部分:
url(r'^book/$',views.book.as_view()),
url(r'^books/(\d+)/$', views.bookdetail.as_view(),name='book_detail'),
#url(r'^books/(?P<pk>\d+)/$', views.bookdetail.as_view(), name='book_detail'),##有名分組,當設置了HyperlinkedIdentityField的時候
'''
講解:
當下面的url被訪問的時候,執行的是下面的view方法

被訪問ul的時候,是就得requets方法,當執行這個下面的get,post等請求的時候,是新的requets
注明一下:這個執行下面的方法的時候,是Apiview(執行dispath())
dispatch()
構建新的requtest對象
'''



生成序列化的類
from rest_framework import serializers  ##這個是rest_frame的序列化組件
from django.core import serializers ##序列化,這個是django序列化的一個組件
from rest_framework.response import Response ##這個是rest_frame的響應組件

class BookModelSerizter(serializers.ModelSerializer):
class Meta:
model=Book##(對book表進行操作)
fields='__all__'
'''
HyperlinkedIdentityField

##下面相當於是加個連接url,當你訪問那個url的時候,就進行反向解析這個url(HyperlinkedIdentityField)

author = serializers.HyperlinkedIdentityField(
view_name='book_detail', ##反向解析
lookup_field='author_id', ##這里是取這個id值,當你循環到那個外鍵的那個id值的值的時候,作為參數傳進去
lookup_url_kwarg='pk' ##把還是那個面的id作為參數傳進去,就是在url路由里面的有名分組
)
'''
'''
create方法:重寫create方法,當你要對某一個字段進行操作的時候,不能用父類的create方法,source不能被解析出來
# ####下面是基於modelserizter的自定制,對那個字段進行自定制
# book_name=serializers.CharField()
# author=serializers.CharField(source='author.pk')
# # publish=serializers.SerializerMethodField()
#
# def create(self, validated_data):
# print('全部的數據',validated_data)
# ##全部的數據 {'book_name': 'julia', 'author': {'pk': '1'}, 'publish': [<Publish: 上海出版社>], 'book_price': [<Price: 1231.21>]}
# Book.objects.create(book_name=validated_data['book_name'],author_id=validated_data['author']['pk'])##當不是manytomany的時候,就可以直接創建,外鍵有的時候,可以是author_id=validated_data['author_id']來創建
# Book.publish.add(*validated_data['publish'])##因為是manytomany的關系,是列表的形式,要加*
# Book.book_price.add(*validated_data['book_price'])####manytomany的關系是這樣寫的,是add 把數據添加進去
# return Response(validated_data)

'''






查看所有的數據,和創建數據
'''
操作:
查看所有的數據queryset類型,all()
具體操作:
all_list=Book.objects.all()
handler=Bookserizter(all_list,many=True)##這個是序列化操作#序列化操作:將queryset和model對象》》json格式的數據
return Response(handler_data)
創建數據
是post的請求,不需要傳參數id進來
requtes.data是接受到的創建的數據
handler=Bookserizter(data=request.data)#反序列操作:將接受到的requets.data的json數據格式轉化為queryset對象類型和model對象
if handler.is_valid():
handler.save()##保存的是queryset對象類型,已經進行反序列化的操作了
保存的是queryset類型的數據

return Response(handler.data)
else;
return Response(handler.errors)


'''

from rest_framework.views import APIView
from django.utils.safestring import mark_safe
from rest_framework.response import Response###導入這個response的模塊
class book(APIView):
def get(self, request):##這個是get的請求方式的時候
book_list=Book.objects.all()#拿到這個queryset的對象集合,queryset對象

Book_ser=BookModelSerizter(book_list,many=True)
print(Book_ser.data)
# return HttpResponse(Book_ser.data)##作為字符串返回了,這個response是django自己的
return Response(Book_ser.data)##這個是resframework里面的response,這個是resfrmework的response,使用這個的時候,會有一個頁面出來


def post(self,request):
data=BookModelSerizter(data=request.data)####前面要加data,這樣才可以提交數據進行校驗
###后面是post請求的數據
if data.is_valid():###進行校驗判斷
print('suc')
data.save()#保存數據進數據庫,看父類源碼,里面有creare的方法
return Response(data.data)
else:
return Response(data.errors)


查看單條數據,修改某個數據,刪除某個數據

##下面是傳了參數進來id
'''
操作:
查看單條數據
model_obj=Book.objects.filter(pk=id).first()##是一個model對象
handler=BookModelSerizter(model_obj)##對model對象進行序列化出租(有序的字典orderdic)
return Response(handler.data)##這個Response是resframe特有的方法,響應器orderdic轉化成正常的字典的格式
修改某一條數據(到那時post,put的請求的時候,都可以進行反序列的操作(修改和創建數據都是queryset對象類型)
model_obj=Book.objects.filtr(pk=id).first()
handler=BookModelSerizter(model_obj,data=request.data)###后面是接受到的數據,前面是對哪一個數據進行編輯操作,如果沒有加前面的話,就是create的操作了
if handler.is_valid():
handler.save()
retutn Response(handler.data)
else;
return Response(handler.errors)
刪除某一條數據
delete_obj=book.objects.filter(pk=id).delete()
return Response()##不返回值
'''

class bookdetail(APIView):

# def get(self,request):
# ##查看所有的書籍
# book_list=Book.objects.all()
# all_list=BookModelSerizter(book_list,many=True)
#
# return Response(all_list.data)

def get(self,request,id):
    #def  get(self,request,pk):##按照這個命名來分組,傳的名字是固定的('(?<pk>\d+)'),名字是里面的pk,也可以是其他的名字

##查看單條數據
print('執行get的請求')
book_obj=Book.objects.filter(id=id).first()#####拿到的是queryset對象,下面進過序列化得到的是一個有序的字典,就可以渲染出來,更好的處理
# after_data=BookModelSerizter(book_obj)
after_data=BookModelSerizter(book_obj,context={'request':request})##文本類型,這個是和上面的連接有關,后面的參數context,HyperlinkedIdentityField,這個是設置了連接的時候,進行的操作
return Response(after_data.data)
######將queryset或者是modle對象序列化成josn數據
#### after_data=BookModelSerizter(book_obj)




'''
requets.data是進行post和put請求與的時候可以拿到
body:requets.data

構建request對象:
self.requets=Request(request)
self.reqeuts._reqeust

get請求:requets.GET.get
post,put請求:requets.data,這個是接受數據request.data
分發get 請求
dispatch()

當進行get請求的時候,把這個queryset對象或者是model對象序列化成json數據
當進行post,put的請求的時候,把這個requets.dtaa接受到的數據反序列化成queryset或者是model對象,然后才可以進行校驗,保存等操作
save的時候,是保存的queryset對象,,已經反序列化了(json》》queryset對象或者是model對象》》數據庫里面的一個記錄)


'''




def put(self,request,id):
book_obj=Book.objects.filter(id=id).first()#####拿到的是queryset對象,下面進過序列化得到的是一個有序的字典,就可以渲染出來,更好的處理
after_hander=BookModelSerizter(book_obj,data=request.data)###對前面的哪一個表的數據進行編輯操作,如果不加前面的話就會是創建數據的操作
#########后面的data是有requets表單里面的數據的時候,要加參數data,就知道哦啊是form_data里面的數據
if after_hander.is_valid():
after_hander.save()
return Response(after_hander.data)###返回這個已經修改好的數據回來,返回傳這個已經序列化好的數據出來
else:

return Response(after_hander.errors)


def delete(self,request,id):
Book.objects.filter(pk=id).delete()

return Response('刪除成功')







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM