這篇文章主要為大家展示了“django model object序列化的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“django model object序列化的示例分析”這篇文章吧。
創(chuàng)新互聯(lián)建站專注于寶坻網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供寶坻營(yíng)銷型網(wǎng)站建設(shè),寶坻網(wǎng)站制作、寶坻網(wǎng)頁(yè)設(shè)計(jì)、寶坻網(wǎng)站官網(wǎng)定制、小程序開(kāi)發(fā)服務(wù),打造寶坻網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供寶坻網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。提到序列化與反序列化,通常會(huì)想到 json ,xml .在J2EE的開(kāi)發(fā)中,這是很常用的技術(shù),比如一個(gè)java class與xml之間的序列化與反序列化,我們可以通過(guò) xstream來(lái)實(shí)現(xiàn),如果是與json之間的轉(zhuǎn)換,我們可以通過(guò) gson.jar或者jsonlib.jar 來(lái)實(shí)現(xiàn)。方法很多,也是常見(jiàn)的方法。
但在python 中,我們常用的是json 的序列化,python2.7 已經(jīng)包含了json package,這個(gè)也是從simplejson 基礎(chǔ)上改變而來(lái)。這個(gè)json 包主要提供了dump,load 來(lái)實(shí)現(xiàn)dict 與 字符串之間的序列化與反序列化,這很方便的可以完成,可以參考這篇文章python json。但現(xiàn)在的問(wèn)題是,這個(gè)json包不能序列化 django 的models 里面的對(duì)象的實(shí)例。
經(jīng)過(guò)分析,網(wǎng)絡(luò)搜索,發(fā)現(xiàn)有如下解決方案.
利用 from django.core import serializers 的方法實(shí)現(xiàn)
from django.core import serializers data = serializers.serialize("json", SomeModel.objects.all()) data1 = serializers.serialize("json", SomeModel.objects.filter(myfield1=myvalue))
上面兩個(gè)是沒(méi)有問(wèn)題的,因?yàn)樾蛄谢膶?duì)象是 Queryset, 因此是成功的。但如果是用SomeModel.objects.get(id=myid) 得到一個(gè)具體的實(shí)例的時(shí)候,問(wèn)題就來(lái)了
data = serializers.serialize("json", SomeModel.objects.get(id=myid))
肯定會(huì)出現(xiàn)如下錯(cuò)誤:
for obj in queryset: TypeError: 'SomeModel' object is not iterable
一看錯(cuò)誤就知道,因?yàn)?SomeModel.objects.get(id=myid) 返回的是一個(gè)具體的實(shí)例,而不是一個(gè)集合對(duì)象,因此是不可以 iterable 的。所以報(bào)錯(cuò)。
從上面的分析可以看出 django的 serializers 只支持 queryset,而不支持model的實(shí)例,那么怎么實(shí)現(xiàn)呢?
1.我們自己把這個(gè)單個(gè)對(duì)象模擬成一個(gè)集合,然后去掉前后的"[""]"符號(hào),就可以了。
from django.utils import simplejson from django.db import models from django.core.serializers import serialize,deserialize from django.db.models.query import QuerySet from django.test import TestCase class MyEncoder(simplejson.JSONEncoder): """ 繼承自simplejson的編碼基類,用于處理復(fù)雜類型的編碼 """ def default(self,obj): if isinstance(obj,QuerySet): """ Queryset實(shí)例 直接使用Django內(nèi)置的序列化工具進(jìn)行序列化 但是如果直接返回serialize('json',obj) 則在simplejson序列化時(shí)會(huì)被從當(dāng)成字符串處理 則會(huì)多出前后的雙引號(hào) 因此這里先獲得序列化后的對(duì)象 然后再用simplejson反序列化一次 得到一個(gè)標(biāo)準(zhǔn)的字典(dict)對(duì)象 """ return simplejson.loads(serialize('json',obj)) if isinstance(obj,models.Model): """ 如果傳入的是單個(gè)對(duì)象,區(qū)別于QuerySet的就是 Django不支持序列化單個(gè)對(duì)象 因此,首先用單個(gè)對(duì)象來(lái)構(gòu)造一個(gè)只有一個(gè)對(duì)象的數(shù)組 這是就可以看做是QuerySet對(duì)象 然后此時(shí)再用Django來(lái)進(jìn)行序列化 就如同處理QuerySet一樣 但是由于序列化QuerySet會(huì)被'[]'所包圍 因此使用string[1:-1]來(lái)去除 由于序列化QuerySet而帶入的'[]' """ return simplejson.loads(serialize('json',[obj])[1:-1]) if hasattr(obj, 'isoformat'): #處理日期類型 return obj.isoformat() return simplejson.JSONEncoder.default(self,obj) def jsonBack(json): """ 進(jìn)行Json字符串的反序列化 一般來(lái)說(shuō),從網(wǎng)絡(luò)得回的POST(或者GET) 參數(shù)中所包含json數(shù)據(jù) 例如,用POST傳過(guò)來(lái)的參數(shù)中有一個(gè)key value鍵值對(duì)為 request.POST['update'] = "[{pk:1,name:'changename'},{pk:2,name:'changename2'}]" 要將這個(gè)value進(jìn)行反序列化 則可以使用Django內(nèi)置的序列化與反序列化 但是問(wèn)題在于 傳回的有可能是代表單個(gè)對(duì)象的json字符串 如: request.POST['update'] = "{pk:1,name:'changename'}" 這是,由于Django無(wú)法處理單個(gè)對(duì)象 因此要做適當(dāng)?shù)奶幚? 將其模擬成一個(gè)數(shù)組,也就是用'[]'進(jìn)行包圍 再進(jìn)行反序列化 """ if json[0] == '[': return deserialize('json',json) else: return deserialize('json','[' + json +']') def getJson(**args): """ 使用MyEncoder這個(gè)自定義的規(guī)則類來(lái)序列化對(duì)象 """ result = dict(args) return simplejson.dumps(result,cls=MyEncoder)
在上面的例子中,自定義了一個(gè)序列化規(guī)則類MyEncoder,用來(lái)處理集合或者集合對(duì)象,然后實(shí)現(xiàn)了一個(gè)可變參數(shù)的工具方法getJson,用于傳入多個(gè)參數(shù),并將其一同序列化。另外還有一個(gè)反序列化對(duì)象的方法jsonBack,接受一個(gè)代表對(duì)象或者對(duì)象集合的json而返回一個(gè)對(duì)象集合。這樣一來(lái)就可以很好的使用配合SimpleJson和Django來(lái)完成序列化工作了
2.直接利用python 2.7 提供的json包,或者用simplejson都可以
首先,你需要在django model的定義中增加一個(gè)方法toJSON,利用了django model 能訪問(wèn) _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_length=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 [f.name for f in self._meta.fields]]))
現(xiàn)在用django查出數(shù)據(jù),并轉(zhuǎn)換成json
row=models.Category.objects.get(autoid=23) print row.toJSON()
你會(huì)發(fā)現(xiàn),成功轉(zhuǎn)換了。當(dāng)然,這個(gè)toJSON方法,如果要求可讀性比較好的話,可以這樣寫(xiě)
def toJSON(self): fields = [] for field in self._meta.fields: fields.append(field.name) d = {} for attr in fields: d[attr] = getattr(self, attr) import json return json.dumps(d)
補(bǔ)充知識(shí):django模型類序列化器 ModelSerializer
1. 定義
比如我們創(chuàng)建一個(gè)BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer): """圖書(shū)數(shù)據(jù)序列化器""" class Meta: model = BookInfo fields = '__all__'
model 指明參照哪個(gè)模型類
fields 指明為模型類的哪些字段生成
2. 指定字段
1) 使用fields來(lái)明確字段,__all__表名包含所有字段,也可以寫(xiě)明具體哪些字段,如
class BookInfoSerializer(serializers.ModelSerializer): """圖書(shū)數(shù)據(jù)序列化器""" class Meta: model = BookInfo fields = ('id', 'btitle', 'bpub_date')
2) 使用exclude可以明確排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer): """圖書(shū)數(shù)據(jù)序列化器""" class Meta: model = BookInfo exclude = ('image',)
3) 默認(rèn)ModelSerializer使用主鍵作為關(guān)聯(lián)字段,但是我們可以使用depth來(lái)簡(jiǎn)單的生成嵌套表示,depth應(yīng)該是整數(shù),表明嵌套的層級(jí)數(shù)量。如:
class HeroInfoSerializer2(serializers.ModelSerializer): class Meta: model = HeroInfo fields = '__all__' depth = 1
4) 指明只讀字段
可以通過(guò)read_only_fields指明只讀字段,即僅用于序列化輸出的字段
3. 添加額外參數(shù)
我們可以使用extra_kwargs參數(shù)為ModelSerializer添加或修改原有的選項(xiàng)參數(shù)
class BookInfoSerializer(serializers.ModelSerializer): """圖書(shū)數(shù)據(jù)序列化器""" class Meta: model = BookInfo fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment') extra_kwargs = { 'bread': {'min_value': 0, 'required': True}, 'bcomment': {'min_value': 0, 'required': True}, }
以上是“django model object序列化的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:djangomodelobject序列化的示例分析-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)網(wǎng)址:http://www.rwnh.cn/article38/dscspp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、網(wǎng)站設(shè)計(jì)公司、網(wǎng)頁(yè)設(shè)計(jì)公司、App開(kāi)發(fā)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容