最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django model object序列化實(shí)例

 更新時(shí)間:2020年03月13日 10:12:01   作者:輕舞肥羊  
這篇文章主要介紹了django model object序列化實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

經(jīng)過分析,網(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è)是沒有問題的,因?yàn)樾蛄谢膶ο笫?Queryset, 因此是成功的。但如果是用SomeModel.objects.get(id=myid) 得到一個(gè)具體的實(shí)例的時(shí)候,問題就來了

data = serializers.serialize("json", SomeModel.objects.get(id=myid))

肯定會出現(xiàn)如下錯(cuò)誤:

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

一看錯(cuò)誤就知道,因?yàn)?SomeModel.objects.get(id=myid) 返回的是一個(gè)具體的實(shí)例,而不是一個(gè)集合對象,因此是不可以 iterable 的。所以報(bào)錯(cuò)。

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

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

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í)會被從當(dāng)成字符串處理
         則會多出前后的雙引號
         因此這里先獲得序列化后的對象
         然后再用simplejson反序列化一次
         得到一個(gè)標(biāo)準(zhǔn)的字典(dict)對象
         """
         return simplejson.loads(serialize('json',obj))
       if isinstance(obj,models.Model):
         """
         如果傳入的是單個(gè)對象,區(qū)別于QuerySet的就是
         Django不支持序列化單個(gè)對象
         因此,首先用單個(gè)對象來構(gòu)造一個(gè)只有一個(gè)對象的數(shù)組
         這是就可以看做是QuerySet對象
         然后此時(shí)再用Django來進(jìn)行序列化
         就如同處理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):
   """  進(jìn)行Json字符串的反序列化
     一般來說,從網(wǎng)絡(luò)得回的POST(或者GET)
     參數(shù)中所包含json數(shù)據(jù)
     例如,用POST傳過來的參數(shù)中有一個(gè)key value鍵值對為
     request.POST['update']
     = "[{pk:1,name:'changename'},{pk:2,name:'changename2'}]"
     要將這個(gè)value進(jìn)行反序列化
     則可以使用Django內(nèi)置的序列化與反序列化
     但是問題在于
     傳回的有可能是代表單個(gè)對象的json字符串
     如:
     request.POST['update'] = "{pk:1,name:'changename'}"
     這是,由于Django無法處理單個(gè)對象
     因此要做適當(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ī)則類來序列化對象
   """
   result = dict(args)
   return simplejson.dumps(result,cls=MyEncoder)

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

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

首先,你需要在django model的定義中增加一個(gè)方法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)然,這個(gè)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)

補(bǔ)充知識:django模型類序列化器 ModelSerializer

1. 定義

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

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

model 指明參照哪個(gè)模型類

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添加或修改原有的選項(xiàng)參數(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序列化實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 30行Python代碼打造一款簡單的人工語音對話

    30行Python代碼打造一款簡單的人工語音對話

    使用gtts和speech_recognition實(shí)現(xiàn)簡單的人工語音對話,通過將語音變成文本,然后文本變成語音,僅用30行代碼,超級簡單,對Python人工語音對話的實(shí)現(xiàn)過程及完整代碼感興趣的朋友一起看看吧
    2021-05-05
  • Python OpenCV圖像指定區(qū)域裁剪的實(shí)現(xiàn)

    Python OpenCV圖像指定區(qū)域裁剪的實(shí)現(xiàn)

    這篇文章主要介紹了Python OpenCV圖像指定區(qū)域裁剪的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 淺談tf.train.Saver()與tf.train.import_meta_graph的要點(diǎn)

    淺談tf.train.Saver()與tf.train.import_meta_graph的要點(diǎn)

    這篇文章主要介紹了淺談tf.train.Saver() 與tf.train.import_meta_graph的要點(diǎn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 如何真正的了解python裝飾器

    如何真正的了解python裝飾器

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于如何真正的了解python裝飾器的相關(guān)文章,需要的朋友們可以參考下。
    2020-08-08
  • pycharm通過ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼詳細(xì)圖文

    pycharm通過ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼詳細(xì)圖文

    在運(yùn)行項(xiàng)目的過程中,由于自己電腦GPU不夠,通常需要將項(xiàng)目放到服務(wù)器上運(yùn)行,這時(shí)就會遇到如何將pycharm和服務(wù)器進(jìn)行連接,下面這篇文章主要給大家介紹了關(guān)于pycharm通過ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 詳解Python requests 超時(shí)和重試的方法

    詳解Python requests 超時(shí)和重試的方法

    這篇文章主要介紹了詳解Python requests 超時(shí)和重試的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報(bào)錯(cuò)

    jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報(bào)錯(cuò)

    這篇文章主要介紹了jupyter notebook引用from pyecharts.charts import Bar運(yùn)行報(bào)錯(cuò),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Windows 安裝 Anaconda3+PyCharm的方法步驟

    Windows 安裝 Anaconda3+PyCharm的方法步驟

    這篇文章主要介紹了Windows 安裝 Anaconda3+PyCharm的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • OpenCV圖像處理GUI功能詳解

    OpenCV圖像處理GUI功能詳解

    GUI功能是opencv的入門知識,本文給大家介紹下OpenCV圖像處理GUI功能,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2022-03-03
  • Python?列表和字典常踩坑即解決方案

    Python?列表和字典常踩坑即解決方案

    這篇文章介紹了?Python?列表和字典常踩坑即解決方案,主要針對python列表和字典得一些問題,提出了多種解決方案。需要的小伙伴可以參考一下
    2022-05-05

最新評論

剑阁县| 辽中县| 开江县| 肃北| 珲春市| 岱山县| 仁布县| 北辰区| 郁南县| 岑巩县| 蛟河市| 铅山县| 民权县| 微博| 七台河市| 榕江县| 大田县| 兴仁县| 井研县| 鹤峰县| 昭觉县| 和静县| 井冈山市| 嘉鱼县| 独山县| 丹寨县| 台东县| 通许县| 长治市| 论坛| 绍兴县| 财经| 张北县| 永仁县| 天气| 镇雄县| 车险| 冷水江市| 苗栗县| 明光市| 鹤庆县|