在 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.