




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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)準的字典(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)會議簽到表
- 生產(chǎn)安全許可證延期
- 特種設(shè)備安全隱患排查
- 市政工程安全檢查表
- web安全在線課程
- 罪犯教育改造培訓(xùn)課件
- 電力調(diào)度通訊 培訓(xùn)課件
- 2025年迪慶客運從業(yè)資格證考試
- 2025至2030驅(qū)動器集成電路行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025至2030中國視像鏡行業(yè)項目調(diào)研及市場前景預(yù)測評估報告
- 頭等大事:脫發(fā)青年自救指南
- 中特第五講社會建設(shè)天津大學(xué)
- 密封條范文模板(A4打印版)
- 施工現(xiàn)場安全交底15篇
- 哈雷之約:基于指數(shù)成分股調(diào)整的選股策略
- 湖北省隨州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 高處作業(yè)審批表
- 急救醫(yī)學(xué)模擬中心建設(shè)方案
- 三維激光掃描技術(shù)與應(yīng)用實例-PPT課件
- 農(nóng)用地評價方法
- (新知杯)2017-2011上海市初中數(shù)學(xué)競賽試卷
評論
0/150
提交評論