在 Django 中將 QuerySet 轉換為 JSON

Vaibhav Vaibhav 2023年1月30日
  1. 使用自定義方法將 QuerySet 轉換為 JSON
  2. 使用 Django 的內建序列化程式將 QuerySet 轉換為 JSON
  3. 使用 values() 函式將 QuerySet 轉換為 JSON
在 Django 中將 QuerySet 轉換為 JSON

在 Django 中,當某個查詢應用於模型時,所有模型管理器都會返回一個 QuerySetQuerySet 可以很容易地在 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 具有內建的序列化程式,可用於將模型轉換為所需的形式。可以使用序列化程式將模型轉換為 JSONXMLJSONLYAML 格式。某些格式需要一些額外的 python 庫才能工作。

假設我們必須將上面的 Person 模型轉換為 JSON 格式。為此,我們將執行以下操作。

from django.core import serializers

person = serializers.serialize("json", Person.objects.get(id=25))
people = serializers.serialize("json", Person.objects.all())

序列化程式可以轉換單個模型以及 QuerySetpersonpeople 變數現在將包含 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")
作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.