IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Django数据库查询集数据(Queryset)转化为json查询value和value_list的用法json.loads和json.dumps -> 正文阅读

[Python知识库]Django数据库查询集数据(Queryset)转化为json查询value和value_list的用法json.loads和json.dumps

先简单回顾一下json和字典的区别

json字典
json是一种格式字典(dict)是一种数据结构
json是类字典的形式,里面的键必须是双引号的字符串dict字典里面的键单、双引号的字符串都可以
json的key可以是有序、重复的字典(dict)的键(key)不可重复

问题概述

      ftyName = request.GET['ftyName']
      type= request.GET['type']
      pvPanelInfo = PvPanel.objects.get(factory=factory, type=type)
      print(type(pvPanelInfo))

后续需要把pvPanelInfo 的<class 'django.db.models.query.QuerySet'>格式转换成json格式

报错

pvPanelInfo 返回的数据是PvPanel object (5)但是print(type(pvPanelInfo))会报如下的错误。

raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type TypeError is not JSON serializable

这里出现的错误是因为用type作为变量名了,应该避免用python函数名作为变量名

问题解决

get获取改成filter获取数据

        ftyName = request.GET['ftyName']
        pvPanelType = request.GET['type']
        # print(ftyName, type(pvPanelType))
        pvPanelInfo = PvPanel.objects.filter(factory=ftyName, type=pvPanelType)

方法一(最原始的方法):

        # 查询集展开为json数据
        pvPanel_data = []
        for pvPanel in pvPanelInfo:
            pvPanel_item = {
                "factory": pvPanel.factory,
                "type": pvPanel.type,
                "length": pvPanel.length,
                "width": pvPanel.width,
            }
            pvPanel_data.append(pvPanel_item)
        data["data"]["pvPanelList"] = pvPanel_data

方法二(给filter后加个values):

        pvPanelInfo = PvPanel.objects.filter(factory=ftyName, type=pvPanelType).values("factory","type","length","width")
        # 查询集展开为json数据
        pvPanel_data = []
        for pvPanel in pvPanelInfo:
            pvPanel_data.append(pvPanel)
        data["data"]["pvPanelList"] = pvPanel_data

返回示例:

            {
                "factory": "宇宙牌光伏板",
                "type": "WH144P6-450",
                "length": 2094,
                "width": 1038
            }

但是这样values很长

方法三(直接按model层设置格式转换)

新建toJSon.py

from rest_framework import serializers  # 这就是express中的serializers
# 序列化的表格也要导入进来
from photovoltaicCalculation.models import PvPanel


# 序列化获取数据库中的数据
class PvPaneltoJSON(serializers.ModelSerializer):
    class Meta:
        depth = 1  # 序列化的深度
        model = PvPanel  # 数据表
        # fields = '__all__'    #返回所有字段
        fields = ["id", "factory", "type", "length", "width"]   #自定义返回字段

调用

from photovoltaicCalculation.toJson import PvPaneltoJSON  #导入刚写类
    pvPanel_data = PvPaneltoJSON(pvPanelInfo, many=True)
    print(pvPanel_data)
    data["data"]["pvPanelList"] = pvPanel_data.data

返回结果

            {
                "factory": "宇宙牌光伏板",
                "type": "WH144P6-450",
                "length": 2094,
                "width": 1038
            }

many=True源码分析(引用)

a. 传many=True,跟不传many=True,实例化的序列化器对象都不一样
b. 通过__new__控制的

# 序列化多条,需要传many=True
book_ser=BookModelSerializer(books,many=True)
book_one_ser=BookModelSerializer(book)
print(type(book_ser))
#<class 'rest_framework.serializers.ListSerializer'>
print(type(book_one_ser))
#<class 'app01.ser.BookModelSerializer'>
 
# 对象的生成--》先调用类的__new__方法,生成空对象
# 对象=类名(name=lqz),触发类的__init__()
# 类的__new__方法控制对象的生成
 
 
def __new__(cls, *args, **kwargs):
    if kwargs.pop('many', False):
        return cls.many_init(*args, **kwargs)
    # 没有传many=True,走下面,正常的对象实例化
    return super().__new__(cls, *args, **kwargs)

问题总结

json.loads()json.dumps()的区别

json.dumps和json.loads()
dict转strstr转成dict
json.dumps 序列化时对中文默认使用的ascii编码,string=json.dumps(data,ensure_ascii=False)

Django-ORM values、values_list区别

官方链接查看 按ctrl+F搜索values

values()values_list()
values()得到的是一个字典形式的查询集(QuerySet),查询集是一个可迭代对象values_list() 结果为元祖型
QuerySet转为list: city_list = list(cities) 再将list序列化为json: city_json = json.dumps(city_list)加上flat=True,返回的是单个值,而不是元祖
values()得到的是一个字典形式的查询集(QuerySet),查询集是一个可迭代对象
# values 结果为字典型
books = Book.objects.filter(id__lt=6).values('number')
[{'number': '1'}, {'number': '2'}, {'number': '3'}, {'number': '4'}, {'number': '5'}]
 
# values_list 结果为元祖型
books = Book.objects.values_list('number')
[('1',), ('2',), ('3',), ('4',), ('5',)]
 
# 获取某个字段所有值2
books = Book.objects.values_list('number', flat=True)
books = ['1', '2', '3', '4', '5']
 
# 获取某个字段所有值(不重复)
models = Book.objects.filter(group=group).values('number').distinct().order_by('number') #必须有order_by

先这样吧,应该还有更好的方法,欢迎留言

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 20:53:29  更:2022-09-24 20:55:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:31:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码