一、前言
最近在專案中有個介面需要將查詢的資料中部分欄位合并為一個字典再回傳,
之前的做法要么是先通過ORM查出資料自己單獨再做處理,要么是通過資料庫函式Concat將這些欄位拼接為一個Json字串進行查詢,后續再做處理,跟第一種的處理方法差不多,兩個都很麻煩,
但在django3.2版本,它們新增了專門的資料庫函式JsonObject來處理這種需求了,
文章目錄
- 一、前言
- 二、JSONObject說明
- 三、特別說明
二、JSONObject說明
獲取鍵值對串列并回傳包含這些對的 JSON 物件,
例如有如下表結構,表模型名稱為Student:
| 欄位 | 描述 |
|---|---|
| id | 學生id |
| name | 學生名稱 |
| age | 學生年齡 |
| gender | 學生性別 |
| address | 家庭地址 |
想查詢學生資訊,并將age、gender、address合并為一個鍵名為info的json物件:
{
"info": {
"age": 16,
"name": "張三",
"address": "中國北京市"
}
}
代碼可以這樣寫:
from django.db.models import F
from django.db.models.functions import JSONObject
stu_data = Student.objects.annotate(
info=JSONObject(name=F('name'), age=F('age')), address=F('address')).values('info')
官方檔案的例子:

三、特別說明
如果涉及多對多關系的話可能會出現類似的報錯:

網上的解決方案會讓你將sql_mode的ONLY_FULL_GROUP_BY配置刪掉
這樣雖然不再報錯了,但查詢的資料會出現遺漏!(只會取多對多關聯資料的第一條資料)
正確的做法是在查詢的時候加上多對多的關聯欄位即可,這樣就不會出現資料的遺漏了,
Django還有很多資料庫函式供我們使用,當我們遇到類似的問題時,不妨先看看官方檔案中:https://docs.djangoproject.com/en/3.2/ref/models/database-functions/ 是否有對應的資料庫函式供我們使用,這樣也避免了重復造輪子的程序,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/348396.html
標籤:python
上一篇:終極版Python打包exe檔案,并修改圖示,這將是你見過最詳細的教程~
下一篇:Python批量修改檔案名
