• Django中开发遇到的问题(11月10号)



    在 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 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    处理转换的方法如下。

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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


    使用 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())
    
    • 1
    • 2
    • 3
    • 4

    序列化程序可以转换单个模型以及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"))
    
    • 1
    • 2
    • 3
    • 4

    我们必须将fields参数设置为模型字段名称的元组。这里需要注意的一个关键点是主键,即id,始终是序列化的,无论你是否提及它。
    要了解有关序列化程序的更多信息,请参阅 Django 的官方文档此处


    使用values()函数将QuerySet转换为JSON

    第三种方法使用可以通过QuerySet调用的values()方法。QuerySet返回一组模型实例,而values() 方法返回一组表示模型实例的字典。
    参考以下代码。

    person = Person.objects.filter(age = 25).values()
    people = Person.objects.all().values()
    
    • 1
    • 2

    默认情况下,字典包含表的所有字段。如果我们必须限制字段,我们可以在此方法中使用可选的位置参数*fields。请参考以下代码片段。

    person = Person.objects.filter(age = 25).values("id", "age", "firstName", "lastName")
    people = Person.objects.all().values("id", "firstName")
    
    • 1
    • 2

    Django给两个字段排序

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

    In [5]: from django.contrib.auth.models import User
    
    In [6]: User.objects.all().order_by("is_active", "-last_login", "first_name") #'-'表示倒叙
    Out[6]: <QuerySet [<User: Guido>, <User: shabda>, <User: Tim>]>
    
    • 1
    • 2
    • 3
    • 4

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

  • 相关阅读:
    [Java]注释——注释真的需要么?
    AcWing 3438. 数制转换
    Anaconda 下载安装
    收藏-即时通讯(IM)开源项目OpenIM-功能手册
    终端常用操作
    C语言百日刷题第四天
    【服务器搭建】教程一:没钱买服务器怎么玩 进来看
    QML之Flow流式布局
    嵌入式实时操作系统的设计与开发(消息)
    记录近期修复Dataguard的过程
  • 原文地址:https://blog.csdn.net/weixin_51333606/article/details/127945850