Django中开发遇到的问题(11月10号)
创始人
2024-02-03 02:03:43
0

目录

    • 在 Django 中将 QuerySet 转换为 JSON
      • 使用自定义方法将`QuerySet`转换为`JSON`
      • 使用 Django 的内置序列化程序将`QuerySet`转换为`JSON`
      • 使用`values()`函数将`QuerySet`转换为`JSON`
    • Django给两个字段排序


在 Django 中将 QuerySet 转换为 JSON

写返回排行榜的功能时,后台报错Exception Type: TypeError Exception Value: Object of type Rank is not JSON serializable
经过层层排查找到原因,Django中内置数据库Sqlite3直接查找出的类型是QuerySet,不能直接响应给前端。故需要将QuerySet转换为JSON

Django中,当某个查询应用于模型时,所有模型管理器都会返回一个QuerySetQuerySet 可以很容易地在PythonDjango的模板语言中使用。我们可以对QuerySet执行许多操作来获取所需的结果或记录。但是QuerySet有一个缺点:它们不是JSON可序列化的。

除了 Web 应用程序,Django 还用于制作 API,在 API 中,JSON是必不可少的,因为数据在服务器和客户端之间以JSON格式传输。

虽然不能直接将QuerySet转换为JSON,但我们可以使用QuerySet来创建 Python 对象或字符串化的JSON


使用自定义方法将QuerySet转换为JSON

假设我们有一个Django模型,如下所示。我们可以编写一个函数,该函数将接受该模型的一个对象并返回该对象的字典表示。

from django.db import modelsclass 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 Nonedictionary = {}dictionary["username"] = person.usernamedictionary["firstName"] = person.firstNamedictionary["middleName"] = person.middleNamedictionary["lastName"] = person.lastNamedictionary["age"] = person.agereturn dictionaryperson = Person.objects.get(id = 25)
personDictionary = personToDictionary(person)

这种方法使我们可以更好地控制我们希望包含在字典表示中的数据。例如,如果我们有外键,我们可以包含引用模型的各种信息。我们还可以进行一些计算并将它们包含在字典中。


使用 Django 的内置序列化程序将QuerySet转换为JSON

Django 具有内置的序列化程序,可用于将模型转换为所需的形式。可以使用序列化程序将模型转换为JSONXMLJSONLYAML 格式。某些格式需要一些额外的 python 库才能工作。

假设我们必须将上面的Person模型转换为JSON格式。为此,我们将执行以下操作。

from django.core import serializersperson = serializers.serialize("json", Person.objects.get(id = 25))
people = serializers.serialize("json", Person.objects.all())

序列化程序可以转换单个模型以及QuerySetpersonpeople变量现在将包含JSON格式的数据。
假设我们只需要转换模型的名称字段。为此,我们将执行以下操作。

from django.core import serializersperson = 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")

Django给两个字段排序

查询集的order_by方法可以接收一个或多个属性名,也就允许你可以给两个或多个字段排序。
django项目下执行python3 manage.py shell命令打开交互式shell

In [5]: from django.contrib.auth.models import UserIn [6]: User.objects.all().order_by("is_active", "-last_login", "first_name") #'-'表示倒叙
Out[6]: , , ]>

参考资料
在 Django 中将 QuerySet 转换为 JSON
Django ORM Cookbook

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...