成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

django model object序列化實例

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

提到序列化與反序列化,通常會想到 json ,xml .在J2EE的開發中,這是很常用的技術,比如一個java class與xml之間的序列化與反序列化,我們可以通過 xstream來實現,如果是與json之間的轉換,我們可以通過 gson.jar或者jsonlib.jar 來實現。方法很多,也是常見的方法。

但在python 中,我們常用的是json 的序列化,python2.7 已經包含了json package,這個也是從simplejson 基礎上改變而來。這個json 包主要提供了dump,load 來實現dict 與 字符串之間的序列化與反序列化,這很方便的可以完成,可以參考這篇文章python json。但現在的問題是,這個json包不能序列化 django 的models 里面的對象的實例。

經過分析,網絡搜索,發現有如下解決方案.

利用 from django.core import serializers 的方法實現

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))

肯定會出現如下錯誤:

for obj in queryset: TypeError: ’SomeModel’ object is not iterable

一看錯誤就知道,因為 SomeModel.objects.get(id=myid) 返回的是一個具體的實例,而不是一個集合對象,因此是不可以 iterable 的。所以報錯。

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

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的編碼基類,用于處理復雜類型的編碼 ''' def default(self,obj): if isinstance(obj,QuerySet): ''' Queryset實例 直接使用Django內置的序列化工具進行序列化 但是如果直接返回serialize(’json’,obj) 則在simplejson序列化時會被從當成字符串處理 則會多出前后的雙引號 因此這里先獲得序列化后的對象 然后再用simplejson反序列化一次 得到一個標準的字典(dict)對象 ''' return simplejson.loads(serialize(’json’,obj)) if isinstance(obj,models.Model): ''' 如果傳入的是單個對象,區別于QuerySet的就是 Django不支持序列化單個對象 因此,首先用單個對象來構造一個只有一個對象的數組 這是就可以看做是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字符串的反序列化 一般來說,從網絡得回的POST(或者GET) 參數中所包含json數據 例如,用POST傳過來的參數中有一個key value鍵值對為 request.POST[’update’] = '[{pk:1,name:’changename’},{pk:2,name:’changename2’}]' 要將這個value進行反序列化 則可以使用Django內置的序列化與反序列化 但是問題在于 傳回的有可能是代表單個對象的json字符串 如: request.POST[’update’] = '{pk:1,name:’changename’}' 這是,由于Django無法處理單個對象 因此要做適當的處理 將其模擬成一個數組,也就是用’[]’進行包圍 再進行反序列化 ''' if json[0] == ’[’: return deserialize(’json’,json) else: return deserialize(’json’,’[’ + json +’]’)def getJson(**args): ''' 使用MyEncoder這個自定義的規則類來序列化對象 ''' result = dict(args) return simplejson.dumps(result,cls=MyEncoder)

在上面的例子中,自定義了一個序列化規則類MyEncoder,用來處理集合或者集合對象,然后實現了一個可變參數的工具方法getJson,用于傳入多個參數,并將其一同序列化。另外還有一個反序列化對象的方法jsonBack,接受一個代表對象或者對象集合的json而返回一個對象集合。這樣一來就可以很好的使用配合SimpleJson和Django來完成序列化工作了

2.直接利用python 2.7 提供的json包,或者用simplejson都可以

首先,你需要在django model的定義中增加一個方法toJSON,利用了django model 能訪問 _meta.fields 得到相關屬性而得到,例子如下

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]]))

現在用django查出數據,并轉換成json

row=models.Category.objects.get(autoid=23) print row.toJSON()

你會發現,成功轉換了。當然,這個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. 定義

比如我們創建一個BookInfoSerializer

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

model 指明參照哪個模型類

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

2. 指定字段

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

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

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

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

3) 默認ModelSerializer使用主鍵作為關聯字段,但是我們可以使用depth來簡單的生成嵌套表示,depth應該是整數,表明嵌套的層級數量。如:

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

4) 指明只讀字段

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

3. 添加額外參數

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

class BookInfoSerializer(serializers.ModelSerializer): '''圖書數據序列化器''' 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序列化實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
夜夜精品浪潮av一区二区三区| 日本一区二区动态图| 日本国产一区二区| 大桥未久av一区二区三区中文| 欧美一区二区三区小说| 欧美日韩视频| 国内外成人在线视频| 久久久久九九九| 欧美1区2区视频| 蜜桃精品视频在线| 中文字幕乱码日本亚洲一区二区| 国产精品综合网| 亚洲天堂激情| 18涩涩午夜精品.www| 欧美日韩一区二区三区四区在线观看| wwwwww.欧美系列| 99riav久久精品riav| 欧美精品一区二区久久婷婷| 91国产成人在线| 99精品在线免费| 麻豆成人久久精品二区三区小说| 中文字幕在线一区免费| 日韩视频一区二区三区在线播放| 欧美亚洲色图校园春色| 97国产一区二区| 国产精品一级在线| 亚洲国产综合色| 中文字幕不卡一区| 91精品国产综合久久久蜜臀图片 | 成人免费福利片| 美国精品在线观看| 亚洲欧洲精品一区二区三区不卡| 日韩欧美中文字幕精品| 欧美在线播放高清精品| 99精品福利视频| 狠久久av成人天堂| 欧美三级免费| 欧美一区高清| 欧美一区二区三区另类| 国产a区久久久| 国产成人在线网站| 国产美女一区二区| 国产美女精品一区二区三区| 日韩制服丝袜先锋影音| 亚洲久草在线视频| 国产精品美女久久久久久久| 欧美一级二级三级乱码| 欧美日韩在线亚洲一区蜜芽| 欧美综合在线视频| 欧美色综合天天久久综合精品| 在线亚洲人成电影网站色www| 91精彩视频在线| 欧美日韩一区二区三区视频| 欧美日本免费一区二区三区| 欧美日韩另类国产亚洲欧美一级| 老鸭窝毛片一区二区三区| 国产精品亚洲综合久久| 国产精品视频福利| 欧美色手机在线观看| 7777精品伊人久久久大香线蕉经典版下载 | 欧美一级黄色大片| 欧美电影免费观看高清完整版在线| 欧美亚洲另类激情小说| 欧美人伦禁忌dvd放荡欲情| 欧美丰满少妇xxxxx高潮对白 | 久久精品国产**网站演员| 老司机精品视频导航| 成人永久aaa| 91蜜桃在线观看| 亚洲午夜一级| 久久国产一区| 日韩欧美一区二区久久婷婷| 久久久一区二区| 国产精品视频yy9299一区| 亚洲黄色性网站| 男男视频亚洲欧美| 国产美女在线观看一区| 99久久精品国产精品久久| 成人精品鲁一区一区二区| 91同城在线观看| 一区在线播放| 91精彩视频在线| 精品国产乱码久久久久久闺蜜 | av成人老司机| 国产私拍一区| 欧美草草影院在线视频| 亚洲靠逼com| 成人av高清在线| 国产欧美一区二区三区另类精品 | ...av二区三区久久精品| 一区二区三区日韩精品视频| 日本不卡1234视频| 99r国产精品| 久久在线精品| 久久久久九九视频| 亚洲444eee在线观看| 国产成人一区在线| 国产伦精品一区二区三区| 欧美日韩国产一区二区三区地区| 久久嫩草精品久久久久| 亚洲自拍另类综合| 丁香婷婷深情五月亚洲| 亚洲日韩视频| 欧美一级艳片视频免费观看| 国产午夜精品一区二区三区视频| 亚洲伊人色欲综合网| 国产成人av在线影院| 亚洲欧美春色| 久久天堂av综合合色蜜桃网| 天天综合日日夜夜精品| 99国产精品久久久久久久久久| 久久久久中文| 欧美高清一级片在线观看| 国产综合久久久久久鬼色| 99riav国产精品| 久久青草国产手机看片福利盒子 | 亚洲一区精品视频| 欧美激情一区二区三区| 久久国产精品露脸对白| 亚洲在线免费| 亚洲男人的天堂在线观看| 91免费国产视频网站| 欧美一卡二卡三卡四卡| 美洲天堂一区二卡三卡四卡视频| 日韩五码在线| 国产精品国产三级国产普通话三级| 成人黄色777网| 欧美男人的天堂一二区| 丝瓜av网站精品一区二区| 亚洲人成毛片在线播放女女| 国产亚洲精品福利| 99视频在线观看一区三区| 日韩女优av电影在线观看| 国产在线一区二区综合免费视频| 欧美在线观看视频在线| 日韩国产精品久久久久久亚洲| 很黄很黄激情成人| 国产婷婷一区二区| 成人午夜私人影院| 欧美肥妇bbw| 经典三级在线一区| 欧美日韩精品欧美日韩精品一综合| 日韩高清不卡在线| 欧美亚洲国产一区二区三区| 天堂蜜桃91精品| 在线观看www91| 久久国产视频网| 欧美日韩国产免费| 久久99久久99小草精品免视看| 色哟哟在线观看一区二区三区| 亚洲成人一二三| 久久久久在线| 日本成人在线一区| 欧美蜜桃一区二区三区| 福利一区二区在线观看| 日韩精品影音先锋| 91影视在线播放| 中文无字幕一区二区三区| 午夜国产精品视频免费体验区| 国产亚洲欧美激情| 亚洲人成毛片在线播放女女| 一片黄亚洲嫩模| 色综合久久久久综合99| 亚洲小说欧美激情另类| 久久久久久久久久久久久9999| 天天操天天干天天综合网| 色妹子一区二区| 精品一区精品二区高清| 精品免费视频.| 你懂的网址国产 欧美| 亚洲丝袜制服诱惑| 在线一区二区三区四区| 成人激情免费网站| 亚洲免费观看高清完整版在线观看| 中文亚洲免费| 久久精品国产亚洲5555| 欧美大片一区二区| 狠狠色噜噜狠狠色综合久| 亚洲综合在线电影| 欧美日韩在线播放| 欧美成人久久| 日韩国产高清在线| 欧美一卡二卡三卡| 一区视频在线看| 极品美女销魂一区二区三区 | jlzzjlzz亚洲日本少妇| 18欧美亚洲精品| 精品视频在线免费观看| 99这里都是精品| 午夜日韩在线电影| 久久这里都是精品| 色婷婷亚洲精品| 成人免费毛片aaaaa**| 亚洲精品视频观看| 91精品国产麻豆国产自产在线 | 精品成人一区二区| 久久国产一二区| 国内自拍视频一区二区三区| 国产一区二区三区免费| 一区二区三区四区乱视频|