Django ORM物件Json序列化問題

2021-08-15 05:43:02 字數 1625 閱讀 1913

碰到了乙個問題:在使用json.dumps()序列化django orm的queryset物件,傳遞給前端的時候,程式報錯:

object of type 'queryset' is not json serializable

在python 中,常用的json 的序列化是從******json 基礎上改變而來。這個json 包主要提供了dump,load 來實現dict 與 字串之間的序列化與反序列化,這很方便的可以完成,但現在的問題是,這個json包不能序列化 django 的models 裡面的物件的例項。

經過一番度娘搜尋,發現有如下解決方案:

使用django.core自帶的serializers模組:

#django orm的 queryset物件預設無法被直接json.dumps()序列化,django.core提供的serializers模組提供將其序列化成str型別

#的功能,serializers處理後,再次json.dumps傳給前端,前端需要經過兩次json.parse()處理,才能得到原物件型別,但是格式發

#生了變化,需要按新的方式取索引.例如:obj['pk']取主鍵,obj['fields']["caption"]取obj的caption欄位

由queryset:

變為了:

[}]

這樣前端就可以正常獲取資料了,只不過此欄位需要兩次json.parse()處理。

至於使用models.host.objects.get(id=xx)的方式獲取到單個物件,而非queryset物件,serializers預設也無法處理的問題,可以自定義json方法來實現dumps序列化

json預設只支援python原生的list、tuple、dict資料型別物件的序列化,若需要擴充套件其他型別物件的序列化功能,可以這樣修改:

import json as default_json

from json.encoder import jsonencoder

class

baseresponse(object):

def__init__(self):

self.status = true

self.message = none

self.data = none

self.error = none

o=baseresponse()

class

jsoncustomencoder(jsonencoder):

defdefault(self, o):

if isinstance(o, baseresponse):

return o.__dict__

return

jsonencoder.default(self, o)

o1=json.dumps(o,cls=jsoncustomencoder)

>>> print(o1)

>>> print(type(o1))

#在序列化時指定cls引數,cls=自定義的序列化類,在自定義序列化類的default方法中判斷,如果是指定的類的例項的話,則將該類轉換成dict格式返回,若指定類的例項,則使用json模組預設的序列化方法。最終得到的return值為str型別。

Django ORM(物件關係對映)

簡而言之,orm就是物件導向語言使用關係型資料庫的中轉站。orm能使開發人員專注於業務邏輯,減少開發人員的負擔,但是orm的缺點也很明顯,效率不高並且無法實現複雜的sql功能。orm不能完全替代sql。from django.db import models create your models h...

Django ORM 關係管理物件的建立

from django.db import models class book models.model title models.charfield max length 32 pub models.foreignkey publisher on delete models.cascade cla...

json轉物件 物件轉json

我們經常會用到json,所以在c 裡就會經常有物件or物件陣列轉json,json轉物件or物件陣列。ps 物件或者json可能是 or,也就是json屬性or json陣列形式,或者json物件屬性裡巢狀,巢狀屬性.無限級巢狀都可以實現。前提 我們定義的物件,或者巢狀物件 一定要和json格式結構...