在 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")