在 Django 中將 QuerySet 轉換為 JSON
在 Django 中,當某個查詢應用於模型時,所有模型管理器都會返回一個 QuerySet
。QuerySet
可以很容易地在 Python 和 Django 的模板語言中使用。我們可以對 QuerySet
執行許多操作來獲取所需的結果或記錄。但是 QuerySet
有一個缺點:它們不是 JSON
可序列化的。
除了 Web 應用程式,Django 還用於製作 API,在 API 中,JSON
是必不可少的,因為資料在伺服器和客戶端之間以 JSON
格式傳輸。
雖然不能直接將 QuerySet
轉換為 JSON
,但我們可以使用 QuerySet
來建立 Python 物件或字串化的 JSON
。有幾種方法可以實現它。本文將討論將 QuerySet
轉換為 JSON
的一些最佳方法。
使用自定義方法將 QuerySet
轉換為 JSON
假設我們有一個 Django 模型,如下所示。我們可以編寫一個函式,該函式將接受該模型的一個物件並返回該物件的字典表示。
from django.db import models
class Person(models.Model):
username = models.CharField(max_length=200, unique=True)
firstName = models.CharField(max_length=200)
middleName = models.CharField(max_length=200)
lastName = models.CharField(max_length=200)
age = models.IntegerField(default=0)
處理轉換的方法如下。
def personToDictionary(person):
if person == None:
return None
dictionary = {}
dictionary["username"] = person.username
dictionary["firstName"] = person.firstName
dictionary["middleName"] = person.middleName
dictionary["lastName"] = person.lastName
dictionary["age"] = person.age
return dictionary
person = Person.objects.get(id=25)
personDictionary = personToDictionary(person)
這種方法使我們可以更好地控制我們希望包含在字典表示中的資料。例如,如果我們有外來鍵,我們可以包含引用模型的各種資訊。我們還可以進行一些計算並將它們包含在字典中。
使用 Django 的內建序列化程式將 QuerySet
轉換為 JSON
Django 具有內建的序列化程式,可用於將模型轉換為所需的形式。可以使用序列化程式將模型轉換為 JSON
、XML
、JSONL
和 YAML
格式。某些格式需要一些額外的 python 庫才能工作。
假設我們必須將上面的 Person
模型轉換為 JSON
格式。為此,我們將執行以下操作。
from django.core import serializers
person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())
序列化程式可以轉換單個模型以及 QuerySet
。person
和 people
變數現在將包含 JSON
格式的資料。
假設我們只需要轉換模型的名稱欄位。為此,我們將執行以下操作。
from django.core import serializers
person = serializers.serialize(
"json", Person.objects.get(id=25), fields=("firstName", "middleName", "lastName")
)
people = serializers.serialize(
"json", Person.objects.all(), fields=("firstName", "middleName", "lastName")
)
我們必須將 fields
引數設定為模型欄位名稱的元組。這裡需要注意的一個關鍵點是主鍵,即 id
,始終是序列化的,無論你是否提及它。
要了解有關序列化程式的更多資訊,請參閱 Django 的官方文件此處。
使用 values()
函式將 QuerySet
轉換為 JSON
第三種方法使用可以通過 QuerySet
呼叫的 values()
方法。QuerySet
返回一組模型例項,而 values()
方法返回一組表示模型例項的字典。
參考以下程式碼。
person = Person.objects.filter(age=25).values()
people = Person.objects.all().values()
預設情況下,字典包含表的所有欄位。如果我們必須限制欄位,我們可以在此方法中使用可選的位置引數 *fields
。請參考以下程式碼片段。
person = Person.objects.filter(age=25).values("id", "age", "firstName", "lastName")
people = Person.objects.all().values("id", "firstName")