天天看點

django-将資料庫資料轉換成JSON格式(ORM和SQL兩種情況)

最近打算搞一個自動化運維平台,是以在看Django的知識。

在實際項目開發中,遇到一個小問題:前後端發生資料互動主流采用的是JSON。前端傳資料到伺服器端比較簡單,稍微麻煩的是伺服器端傳JSON到前端。

首先資料是從資料庫中擷取的,Django預設使用的是ORM技術,但是作為一個運維人員,我其實比較反感這類抽象出來的API。因為盡管它對于開發人員來說,将資料庫的表抽象成了一個對象,便于開發,不需要寫SQL語句,但是這也是後期程式造成性能瓶頸的罪魁禍首(再做一次故障處理時,遇到一條70幾行的SQL語句。。。。。),另外對于一個運維人員來說,純SQL是基本能力,再次去學習ORM的文法,無形中又增加了學習成本。

不管怎麼說,這次的主題是将從資料庫擷取資料轉換成JSON,下面會将用ORM和SQL兩種方式都拿出來分享。

1.采用Django Model層,ORM技術  轉換成JSON格式

1 def getdata(request):
2    # 使用ORM
3    # all()傳回的是QuerySet 資料類型;values()傳回的是ValuesQuerySet 資料類型
4    data = models.VM.objects.values('id', 'ip', 'host', 'username')
5    data = serializers.serialize("json", tomcats)
6    return JsonResponse(list(data), safe=False)      

2.完全棄用Django Model層,純SQL  轉換成JSON格式

1 def getdata(request):
2 # 使用SQL
3     with connection.cursor() as cursor:
4         cursor.execute('select id, machine, tomcathome, ipaddress, description from tomcatData')
5         data = dictfetchall(cursor)
6     return JsonResponse(data, safe=False, json_dumps_params={'ensure_ascii': False})      
1 # 将傳回結果轉換成字典
2 def dictfetchall(cursor):
3     "Return all rows from a cursor as a dict"
4     columns = [col[0] for col in cursor.description]
5     return [
6         dict(zip(columns, row))
7         for row in cursor.fetchall()
8     ]      

JsonResponse 對象:

class 

JsonResponse

(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None,**kwargs)

這個類是HttpRespon的子類,它主要和父類的差別在于:

1.它的預設Content-Type 被設定為: application/json

2.第一個參數,data應該是一個字典類型,當 safe 這個參數被設定為:False ,那data可以填入任何能被轉換為JSON格式的對象,比如list, tuple, set。 預設的safe 參數是 True. 如果你傳入的data資料類型不是字典類型,那麼它就會抛出 TypeError的異常。

3.json_dumps_params參數是一個字典,它将調用json.dumps()方法并将字典中的參數傳入給該方法。

通過以上的解釋,上面兩個方法的JsonResponse()裡面傳入的參數就很清晰明了。

這樣資料就會以JSON格式傳入到前端,前端就能用AJAX擷取到,并進行處理或者展示了。

轉載于:https://www.cnblogs.com/swim/p/7132111.html