一、序列化組件
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供曲麻萊網(wǎng)站建設(shè)、曲麻萊做網(wǎng)站、曲麻萊網(wǎng)站設(shè)計(jì)、曲麻萊網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、曲麻萊企業(yè)網(wǎng)站模板建站服務(wù),十余年曲麻萊做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。環(huán)境配置:
使django支持Mysql(前面已有介紹,這里不再重復(fù))
使django支持 framework
在settings.py中的INSTALLED_APPS字段添加:
"rest_framework"
序列化組件的使用
-Serializer -1 重命名:用source:xx = serializers.CharField(source='name') -2 取出出版社名字: 方式一: -在模型表中重寫__str__方法 -publish=serializers.CharField() 方式二: -用source -拿出出版社的城市 -publish=serializers.CharField(source='publish.city') *****如果不指定source,字段必須對應(yīng)起來,如果指定了source,字段可以任意命名 -source 可以指定字段,也可也指定方法 publish.test這是個(gè)方法,會執(zhí)行該方法,并拿到返回結(jié)果 test = serializers.CharField(source='publish.test') -3 SerializerMethodField,可以指定一個(gè)方法 publish=serializers.SerializerMethodField() # 方法名:叫g(shù)et_字段名,要傳參數(shù),參數(shù)是:當(dāng)前book對象 def get_publish(self,obj): # obj 是當(dāng)前book對象 dic={'name':obj.publish.name,'email':obj.publish.email} return dic -方法內(nèi)部可以繼續(xù)用其他的序列化類 -ModelSerializer -必須在類中寫 class Meta: model=指定表 # fields = '__all__' # 指定只取這兩個(gè)字段 fields = ['nid','name'] # 去掉指定的字段 # exclude=['publish','authors'] # fields,跟exclude不能連用 # 指定深度,就是跨幾個(gè)表(官方建議小于10,我給你的建議小于3) # depth = 2
urls.py
url(r'^books/', views.Books.as_view()),
views.py
from django.shortcuts import render from app01 import models # Create your views here. from rest_framework.views import APIView from app01.server import BookSerializer from django.http import JsonResponse class Books(APIView): def get(self,request,*args,**kwargs): # ret=models.Book.objects.all() # 生成一個(gè)序列化的對象,傳參數(shù) # 序列化多條,記住many=True book_ser=BookSerializer(ret,many=True) print(book_ser.data) # safe=False 可以序列化列表 return JsonResponse(book_ser.data, safe=False
models.py
from django.db import models # Create your models here. class Book(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish_date = models.DateField() # 外鍵對應(yīng)數(shù)據(jù)庫表中的字段名后面會自動加"_id" # on_delete=models.CASCADE 級聯(lián)刪除 publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE) # ManyToManyField 自動創(chuàng)建第三張表,本表名_到你對應(yīng)多的表名名字,自動幫你把表名轉(zhuǎn)小寫 authors = models.ManyToManyField(to='Author') def __str__(self): return self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.IntegerField() author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE) class AuthorDatail(models.Model): nid = models.AutoField(primary_key=True) telephone = models.BigIntegerField() birthday = models.DateField() addr = models.CharField(max_length=64) class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.EmailField() def __str__(self): return self.name def test(self): return self.email
最后使用:
python3 manage makemigrations
python3 manage migrate
app01/server.py
from rest_framework import serializers # class AuthorSerializer(serializers.Serializer): # nid = serializers.CharField() # name = serializers.CharField() # age = serializers.CharField() # class BookSerializer(serializers.Serializer): # # 可以用source修改別名 # # - source 可以指定字段,也可也指定方法 # abc = serializers.CharField(source='name') # 對應(yīng)models.py中 Book 類中的 name 字段,這里的名字必須要和 Book 類中的 name 字段相互匹配 # price = serializers.CharField() # # - source 可以指定字段,也可也指定方法 # publish_alias = serializers.CharField(source='publish.city') # publish_id = serializers.CharField() # # 可以指定并運(yùn)行方法中的函數(shù),并拿到返回結(jié)果 # test_auth = serializers.CharField(source='publish.test') # # SerializerMethodField,可以指定一個(gè)方法 # publish = serializers.SerializerMethodField() # # # 函數(shù)名必須是get_字段名,要傳參數(shù),參數(shù)是:當(dāng)前book對象 # def get_publish(self, obj): # dic = {'name': obj.publish.name, 'email': obj.publish.email} # return dic # # authors = serializers.SerializerMethodField() # # # 方式一:(了解) # # def get_authors(self, book): # # # 拿到這本書的所有作者 # # aus = book.authors.all() # # # 拼出一個(gè)列表, 列表中套字典, 每個(gè)字典是一個(gè)作者 # # li = [] # # for i in aus: # # li.append({'name': i.name, 'age': i.age}) # # return li # # -----------分割線------不用for循環(huán) 也可以拿到作者信息-------------------- # # 方式二:(推薦) # # 方法內(nèi)部可以繼續(xù)用其他的序列化類 # def get_authors(self, book): # aus = book.authors.all() # # 可以繼續(xù)用序列化類,來處理 # auth_ser = AuthorSerializer(aus, many=True) # return auth_ser.data # 方式三:(主推薦)# 需要把以上代碼全部都注釋掉方可使用下面的方式。 # class AuthorSerializer(serializers.Serializer): # nid = serializers.CharField() # name = serializers.CharField() # age = serializers.CharField() # # # from app01.models import Book # # # class BookSerializer(serializers.ModelSerializer): # # 必須寫一個(gè)內(nèi)部類,名字必須叫Meta # class Meta: # # 這樣就可以拿到Book 表中的所有信息了 # model = Book # fields = '__all__' # # 重寫屬性,可以顯示出publish的具體內(nèi)容,不寫的話,只是會顯示publish的ID # # publish = serializers.CharField(source='publish.name') # authors = serializers.SerializerMethodField() # # def get_authors(self, book): # aus = book.authors.all() # auth_ser = AuthorSerializer(aus, many=True) # return auth_ser.data # 方式四:需要把以上代碼全部都注釋掉方可使用下面的方式。 from app01.models import Book class BookSerializer(serializers.ModelSerializer): class Meta: # 這樣就可以拿到Book 表中的所有信息了 model = Book # fields = '__all__' # 指定深度,就是跨幾個(gè)表(官方建議小于10,我給你的建議小于3),可控性差,效率低(因?yàn)橐獊砘夭閿?shù)據(jù)庫) # depth = 2 # -------------分割線----------fields = '__all__';depth = 2 去注釋 # 去掉指定的字段 # exclude=['publish','authors'] # ----------分割線在Meta類中,除了model = Book 不注釋,其他都需要注釋掉方可顯示出效果 # 指定只取這兩個(gè)字段 # 注意:exclude與fields不能聯(lián)用 fields = ['nid', 'name']
最后只使用postman 的get 方式來驗(yàn)證即可。不用修改里面配置
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。