版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Django model,QuerySet 序列化成json的方法 提到序列化與反序列化,通常會想到 json ,xml .在J2EE的開發(fā)中,這是很常用的技術(shù),比如一個java class與xml之間的序列化與反序列化,我們可以通過 xstream來實現(xiàn),如果是與json之間的轉(zhuǎn)換,我們可以通過 gson.jar或者jsonlib.jar 來實現(xiàn)。方法很多,也是常見的方法。但在python 中,我們常用的是json 的序列化,python2.7 已經(jīng)包含了json package,這個也是從simplejson 基礎(chǔ)上改變而來。這個json 包主要提供了dump,load 來實現(xiàn)dict 與
2、 字符串之間的序列化與反序列化,這很方便的可以完成,可以參考這篇文章python json。但現(xiàn)在的問題是,這個json包不能序列化 django 的models 里面的對象的實例。經(jīng)過分析,網(wǎng)絡(luò)搜索,發(fā)現(xiàn)有如下解決方案.利用 from django.core import serializers 的方法實現(xiàn) 程序代碼from django.core import serializersdata = serializers.serialize(json, SomeModel.objects.all()data1 = serializers.serialize(json, SomeModel.o
3、bjects.filter(myfield1=myvalue)上面兩個是沒有問題的,因為序列化的對象是 Queryset, 因此是成功的。但如果是用SomeModel.objects.get(id=myid) 得到一個具體的實例的時候,問題就來了 程序代碼data = serializers.serialize(json, SomeModel.objects.get(id=myid)肯定會出現(xiàn)如下錯誤:for obj in queryset:TypeError: SomeModel object is not iterable一看錯誤就知道,因為 SomeModel.objects.get(i
4、d=myid) 返回的是一個具體的實例,而不是一個集合對象,因此是不可以 iterable 的。所以報錯。從上面的分析可以看出 django的 serializers 只支持 queryset,而不支持model的實例,那么怎么實現(xiàn)呢?1.我們自己把這個單個對象模擬成一個集合,然后去掉前后的符號,就可以了。 程序代碼from django.utils import simplejson from django.db import models from django.core.serializers import serialize,deserialize from django.db.mod
5、els.query import QuerySet from django.test import TestCase class MyEncoder(simplejson.JSONEncoder): 繼承自simplejson的編碼基類,用于處理復(fù)雜類型的編碼 def default(self,obj): if isinstance(obj,QuerySet): Queryset實例 直接使用Django內(nèi)置的序列化工具進行序列化 但是如果直接返回serialize(json,obj) 則在simplejson序列化時會被從當(dāng)成字符串處理 則會多出前后的雙引號 因此這里先獲得序列化后的對象 然
6、后再用simplejson反序列化一次 得到一個標(biāo)準(zhǔn)的字典(dict)對象 return simplejson.loads(serialize(json,obj) if isinstance(obj,models.Model): 如果傳入的是單個對象,區(qū)別于QuerySet的就是 Django不支持序列化單個對象 因此,首先用單個對象來構(gòu)造一個只有一個對象的數(shù)組 這是就可以看做是QuerySet對象 然后此時再用Django來進行序列化 就如同處理QuerySet一樣 但是由于序列化QuerySet會被所包圍 因此使用string1:-1來去除 由于序列化QuerySet而帶入的 return
7、 simplejson.loads(serialize(json,obj)1:-1) if hasattr(obj, isoformat): #處理日期類型 return obj.isoformat() return simplejson.JSONEncoder.default(self,obj) def jsonBack(json): 進行Json字符串的反序列化 一般來說,從網(wǎng)絡(luò)得回的POST(或者GET) 參數(shù)中所包含json數(shù)據(jù) 例如,用POST傳過來的參數(shù)中有一個key value鍵值對為 request.POSTupdate = pk:1,name:changename,pk:2,
8、name:changename2 要將這個value進行反序列化 則可以使用Django內(nèi)置的序列化與反序列化 但是問題在于 傳回的有可能是代表單個對象的json字符串 如: request.POSTupdate = pk:1,name:changename 這是,由于Django無法處理單個對象 因此要做適當(dāng)?shù)奶幚?將其模擬成一個數(shù)組,也就是用進行包圍 再進行反序列化 if json0 = : return deserialize(json,json) else: return deserialize(json, + json +) def getJson(*args): 使用MyEncod
9、er這個自定義的規(guī)則類來序列化對象 result = dict(args) return simplejson.dumps(result,cls=MyEncoder)在上面的例子中,自定義了一個序列化規(guī)則類MyEncoder,用來處理集合或者集合對象,然后實現(xiàn)了一個可變參數(shù)的工具方法getJson,用于傳入多個參數(shù),并將其一同序列化。另外還有一個反序列化對象的方法jsonBack,接受一個代表對象或者對象集合的json而返回一個對象集合。這樣一來就可以很好的使用配合SimpleJson和Django來完成序列化工作了2.直接利用python 2.7 提供的json包,或者用simplejson
10、都可以首先,你需要在django model的定義中增加一個方法toJSON,利用了django model 能訪問 _meta.fields 得到相關(guān)屬性而得到,例子如下 程序代碼class Category(models.Model): autoid = models.AutoField(primary_key=True) email=models.CharField(max_length=150,blank=False) comtype=models.CharField(max_length=20,blank=False) catname=models.CharField(max_len
11、gth=150,blank=False) def _unicode_(self): return %s % (self.catname) def toJSON(self): import json return json.dumps(dict(attr, getattr(self, attr) for attr in for f in self._meta.fields)現(xiàn)在用django查出數(shù)據(jù),并轉(zhuǎn)換成json 程序代碼row=models.Category.objects.get(autoid=23) print row.toJSON()你會發(fā)現(xiàn),成功轉(zhuǎn)換了。當(dāng)然,這個toJSON方法,如果要求可讀性比較好的話,可以這樣寫程序代碼def toJSON(self): fields = for field in se
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年黑龍江旅游職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年貴州裝備制造職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題有答案解析
- 2026年河南工業(yè)和信息化職業(yè)學(xué)院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年長沙南方職業(yè)學(xué)院單招綜合素質(zhì)筆試備考題庫附答案詳解
- 2026年安徽國際商務(wù)職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性考試模擬試題帶答案解析
- 2026年福州科技職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試參考題庫帶答案解析
- 投資合作協(xié)議合同協(xié)議(2025年)
- 2026年鶴壁職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試模擬試題帶答案解析
- 2026年河南工業(yè)和信息化職業(yè)學(xué)院單招綜合素質(zhì)筆試模擬試題帶答案解析
- 2026年河南經(jīng)貿(mào)職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試備考試題有答案解析
- 2025年學(xué)校食堂從業(yè)人員食品安全知識培訓(xùn)考試試題(附答案)
- 2025年建筑信息化行業(yè)分析報告及未來五至十年行業(yè)發(fā)展報告
- 建筑防欠薪管理制度
- 中國共產(chǎn)主義青年團紀(jì)律處分條例試行解讀學(xué)習(xí)
- 2025年廣東省深圳市中考英語復(fù)習(xí)聽說題型課件信息復(fù)述提問
- 咖啡消費人群的細分與定位-全面剖析
- 09.品質(zhì)月報統(tǒng)計表模板
- 2024-2025學(xué)年北京朝陽區(qū)九年級初三(上)期末歷史試卷(含答案)
- DB11T 354-2023 生活垃圾收集運輸管理規(guī)范
- 赤石特大橋施工安全風(fēng)險評估報告
- QBT 2770-2006 羽毛球拍行業(yè)標(biāo)準(zhǔn)
評論
0/150
提交評論