日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

django model object序列化實例

瀏覽:126日期:2024-10-21 13:23:05

提到序列化與反序列化,通常會想到 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 與 字符串之間的序列化與反序列化,這很方便的可以完成,可以參考這篇文章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.objects.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(id=myid) 返回的是一個具體的實例,而不是一個集合對象,因此是不可以 iterable 的。所以報錯。

從上面的分析可以看出 django的 serializers 只支持 queryset,而不支持model的實例,那么怎么實現(xiàn)呢?

1.我們自己把這個單個對象模擬成一個集合,然后去掉前后的'['']'符號,就可以了。

from django.utils import simplejsonfrom django.db import modelsfrom django.core.serializers import serialize,deserializefrom django.db.models.query import QuerySetfrom django.test import TestCaseclass MyEncoder(simplejson.JSONEncoder): ''' 繼承自simplejson的編碼基類,用于處理復(fù)雜類型的編碼 ''' def default(self,obj): if isinstance(obj,QuerySet): ''' Queryset實例 直接使用Django內(nèi)置的序列化工具進行序列化 但是如果直接返回serialize(’json’,obj) 則在simplejson序列化時會被從當(dāng)成字符串處理 則會多出前后的雙引號 因此這里先獲得序列化后的對象 然后再用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會被’[]’所包圍 因此使用string[1:-1]來去除 由于序列化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): ''' 進行Json字符串的反序列化 一般來說,從網(wǎng)絡(luò)得回的POST(或者GET) 參數(shù)中所包含json數(shù)據(jù) 例如,用POST傳過來的參數(shù)中有一個key value鍵值對為 request.POST[’update’] = '[{pk:1,name:’changename’},{pk:2,name:’changename2’}]' 要將這個value進行反序列化 則可以使用Django內(nèi)置的序列化與反序列化 但是問題在于 傳回的有可能是代表單個對象的json字符串 如: request.POST[’update’] = '{pk:1,name:’changename’}' 這是,由于Django無法處理單個對象 因此要做適當(dāng)?shù)奶幚? 將其模擬成一個數(shù)組,也就是用’[]’進行包圍 再進行反序列化 ''' if json[0] == ’[’: return deserialize(’json’,json) else: return deserialize(’json’,’[’ + json +’]’)def getJson(**args): ''' 使用MyEncoder這個自定義的規(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都可以

首先,你需要在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_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()

你會發(fā)現(xiàn),成功轉(zhuǎn)換了。當(dāng)然,這個toJSON方法,如果要求可讀性比較好的話,可以這樣寫

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)

補充知識:django模型類序列化器 ModelSerializer

1. 定義

比如我們創(chuàng)建一個BookInfoSerializer

class BookInfoSerializer(serializers.ModelSerializer): '''圖書數(shù)據(jù)序列化器''' class Meta: model = BookInfo fields = ’__all__’

model 指明參照哪個模型類

fields 指明為模型類的哪些字段生成

2. 指定字段

1) 使用fields來明確字段,__all__表名包含所有字段,也可以寫明具體哪些字段,如

class BookInfoSerializer(serializers.ModelSerializer): '''圖書數(shù)據(jù)序列化器''' class Meta: model = BookInfo fields = (’id’, ’btitle’, ’bpub_date’)

2) 使用exclude可以明確排除掉哪些字段

class BookInfoSerializer(serializers.ModelSerializer): '''圖書數(shù)據(jù)序列化器''' class Meta: model = BookInfo exclude = (’image’,)

3) 默認(rèn)ModelSerializer使用主鍵作為關(guān)聯(lián)字段,但是我們可以使用depth來簡單的生成嵌套表示,depth應(yīng)該是整數(shù),表明嵌套的層級數(shù)量。如:

class HeroInfoSerializer2(serializers.ModelSerializer): class Meta: model = HeroInfo fields = ’__all__’ depth = 1

4) 指明只讀字段

可以通過read_only_fields指明只讀字段,即僅用于序列化輸出的字段

3. 添加額外參數(shù)

我們可以使用extra_kwargs參數(shù)為ModelSerializer添加或修改原有的選項參數(shù)

class BookInfoSerializer(serializers.ModelSerializer): '''圖書數(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)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩视频免费观看| 日本亚洲视频在线| 国产免费av国片精品草莓男男| 好看不卡的中文字幕| 亚洲成人一区| 午夜欧美理论片| 久久xxxx精品视频| 日本不卡不码高清免费观看| 日韩欧美高清一区二区三区| 青草久久视频| 国产精东传媒成人av电影| 久久字幕精品一区| 国产66精品| 影视先锋久久| 爽好多水快深点欧美视频| 天使萌一区二区三区免费观看| 蜜桃av一区二区三区电影| 亚洲人成精品久久久| 日韩精品一级中文字幕精品视频免费观看| 亚洲一区二区动漫| 午夜久久av | 亚洲精品三级| 欧美一级一区| 精品资源在线| 亚洲成av在线| 视频一区中文字幕| 国产欧美在线| 中国字幕a在线看韩国电影| 99精品在线观看| 亚洲综合国产| 日韩在线黄色| 国产一区二区三区四区| 欧美va亚洲va日韩∨a综合色| 丝袜诱惑制服诱惑色一区在线观看 | 午夜精品影院| 亚洲aa在线| 狠狠久久伊人| 亚洲黄色影院| 国产精品亲子伦av一区二区三区 | 日韩激情中文字幕| 国产精品99久久精品| 久久久五月天| 日韩黄色av| 香蕉视频亚洲一级| 中文字幕日韩欧美精品高清在线| 欧美经典一区| 亚洲成人三区| 久久av综合| 日韩一区二区免费看| 国产精品一区二区免费福利视频| 日韩成人高清| 久久香蕉精品| 国产一区二区三区四区大秀| 亚洲综合日本| 日韩av二区| 日本不卡高清| 久久久久国产| 国产精品大片免费观看| 亚洲美洲欧洲综合国产一区| 欧美激情视频一区二区三区在线播放| 久久国产电影| 国产精品久久久久av蜜臀| 五月天久久网站| 麻豆精品视频在线| 亚洲欧美日韩精品一区二区| 国产日韩1区| 精品一区在线| 麻豆一区二区99久久久久| 国产一区成人| 国产欧洲在线| 国产亚洲观看| 日韩中文字幕亚洲一区二区va在线 | 日本国产一区| 国内精品福利| 精品入口麻豆88视频| 国产手机视频一区二区| 精品视频国内| 天堂精品久久久久| 蜜桃一区二区三区| 成人精品国产亚洲| 欧美日韩亚洲一区三区| 午夜一级久久| 91精品蜜臀一区二区三区在线 | 国产精品videossex久久发布| 免费日韩av| 99久久久久| 日本激情一区| 国产精品一区二区免费福利视频| 亚洲激情另类| 成人精品中文字幕| 麻豆91在线播放| 日韩毛片网站| 丝袜诱惑制服诱惑色一区在线观看 | 国产一区二区三区不卡av | 精品免费视频| 日韩av一二三| 中文字幕av一区二区三区人| 亚洲午夜精品久久久久久app| 国产一区二区精品福利地址| 久久精品99久久久| 亚洲v天堂v手机在线| 香蕉精品999视频一区二区| 久久激情一区| 亚洲精品**中文毛片| 久久男人av| 国产一级成人av| 日韩有吗在线观看| 亚洲精品系列| 蜜臀91精品一区二区三区| 国产在线不卡| 久久精品高清| 久久精品一区二区不卡| 中文一区一区三区高中清不卡免费| 国产精品高潮呻吟久久久久| 日本色综合中文字幕| 亚洲精品婷婷| 日本不卡视频在线观看 | 免费精品一区| 国产精品羞羞答答在线观看| 欧美亚洲tv| 91麻豆精品| 天堂精品久久久久| 日韩av影院| 国产日韩在线观看视频| 国产日本亚洲| 国产精品99久久久久久董美香| 国产精品日韩精品中文字幕| 麻豆视频观看网址久久| 牛牛精品成人免费视频| 精品免费视频| 91亚洲国产成人久久精品| 成午夜精品一区二区三区软件| а√天堂8资源在线| 国产麻豆久久| 国产一区日韩一区| 日韩一级网站| 男人的天堂久久精品| 日韩在线一区二区| 亚洲精品在线国产| 久久国产麻豆精品| 国内精品美女在线观看| 亚洲一级少妇| 国产综合欧美| 亚洲天堂免费| 国产欧美日韩在线一区二区 | 国产精品99免费看| 在线视频亚洲| 日韩精品中文字幕一区二区| 国产亚洲一卡2卡3卡4卡新区| 国产精品白丝久久av网站| 免费看日韩精品| 久久国内精品| 国际精品欧美精品| 激情婷婷久久| 视频一区中文字幕精品| 国产精品丝袜在线播放| 色欧美自拍视频| 好吊日精品视频| 日韩超碰人人爽人人做人人添| 麻豆久久久久久久| 欧美中文一区二区| 亚洲三级视频| 国内一区二区三区| 午夜日韩av| 国产日韩一区二区三区在线| 成人午夜在线| 国产精品毛片在线| 国产欧美啪啪| 99视频精品全国免费| 亚洲伊人影院| 久久一区亚洲| 午夜精品网站| 国产精品久一| 在线看片不卡| 国产精品一区二区精品| 久久久蜜桃一区二区人| 亚洲免费观看高清完整版在线观| 美女国产精品久久久| 亚洲国产不卡| 国产精品黄网站| 久久高清免费| 久久国产麻豆精品| 欧美一区二区三区高清视频| 日韩一区免费| 欧美二三四区| 日韩高清国产一区在线| 精品捆绑调教一区二区三区| 亚洲人成网站在线在线观看| av免费不卡国产观看| 中文一区一区三区免费在线观 | 国内自拍视频一区二区三区| 一区二区亚洲精品| 欧美激情日韩| 丝袜亚洲另类欧美 | 国产精品亚洲人成在99www| 欧美91福利在线观看| 欧美国产专区| 在线精品亚洲| 在线观看精品| 国产精品传媒麻豆hd|