当前位置: 首页 > article >正文

python将字符串类型的字典以json格式保存到数据库教程

from django.db import models
class ProtocolConfModel(models.Model):
    """http,ftp,telnet,smpt,pop3配置"""
    id = models.AutoField(auto_created=True, primary_key=True, serialize=False, help_text="ID")
    tplid = models.IntegerField(blank=True, null=True, help_text="模板ID")
    config_content = models.CharField(max_length=2400, blank=True, help_text='存储http,ftp,telnet,smpt,pop3配置页面填写的所有内容')
    protocol = models.SmallIntegerField(blank=True, help_text="协议, 存储数字和中文的对应关系: 1-http 2-ftp 3-telnet 4-smtp 5-pop3 6-dns")
    config_content = models.JSONField()  # 使用 JSONField 来存储 JSON 格式数据

核心代码就是上面config_content =models.JSONField()这行代码;

使用 JSONField 来存储和操作 JSON 数据。Django 会自动将数据转换成正确的格式,包括双引号。

  1. 确保插入的数据是字典格式
    当你使用 ProtocolConfModel.objects.create() 来插入数据时,你可以直接传递 Python 字典(如 http_conf),Django 会自动处理字典格式并将其转换为正确的 JSON 格式,保留双引号。

    示例代码:

    http_conf = {
        "protocol": [],
        "headerfilter": "",
        "netfilter": "",
        "urlfilter": "",
        "javafilter": "0",
        "scriptfilter": "0",
        "activexfilter": "0"
    }
    
    # 使用 Django ORM 保存数据
    ProtocolConfModel.objects.create(
        tplid=tpl.id,
        protocol=i + 1,
        config_content=http_conf  # 直接传递字典,Django 会自动处理为 JSON 格式
    )
    
  2. MySQL 存储
    这样,Django 会将 http_conf 字典转换为 JSON 格式,并插入到 MySQL 中。MySQL 会将其存储为 JSON 数据类型,自动保留双引号。例如:

    {
        "protocol": [],
        "headerfilter": "",
        "netfilter": "",
        "urlfilter": "",
        "javafilter": "0",
        "scriptfilter": "0",
        "activexfilter": "0"
    }

下面是保存成功mysql数据库config_content列的内容

可以很清楚看到双引号得到保留, 这样在读取的时候也很方便

import time
from rest_framework import status
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView, ListAPIView
from contentfilter.content_template.models import ProtocolConfModel
from contentfilter.content_template.serializers import ContentProtocolConfSerializer
from common.constants import response_data, write_utm_log


class GetProtoConf(ListAPIView):

    def get(self, request, *args, **kwargs):
        """ 获取协议配置信息

        :param int protocol: 协议类型  数字和中文的对应关系: http-1 ftp-2 telnet-3 smtp-4 pop3-5 比如http配置则protocol传数字1
        :param int tplid: 模板id

        :return:
        """
        proto = self.request.query_params.get("protocol", 1)
        tplid = self.request.query_params.get("tplid", 1)
        if proto.isdigit():
            proto = int(proto)
        else:
            proto = 1
        protocol_conf = ProtocolConfModel.objects.filter(protocol=proto, tplid=tplid)
        if protocol_conf.exists():
            for item in protocol_conf:
                config_content = item.config_content
                config_content.update({"id": item.id})
                datas = {
                    "code": 200,
                    "timestamp": int(time.time()),
                    "result":  config_content,
                    "msg": "返回数据成功"
                }
        else:
            datas = {
                "code": 400,
                "timestamp": int(time.time()),
                "result": [],
                "msg": "前端传的协议值或模板值在数据库不存在"
            }
        return Response(datas, status=status.HTTP_200_OK)

使用postman调用查询接口

 可以很清楚看到返回的正好也是上面存储的字典类型的字符串, 也是json格式的

还有另外一种方法是不在model里面设置 config_content = models.JSONField() , 使用json.loads() 去加载解析json,. 但是作者在使用这种方式时发现, 添加时config_content内容中所有引号明明给的是双引号, 但是插入到数据库却变成了单引号, 查询达到的答案如下:

然后继续追问, 需要将http_conf键值对是双引号保存到mysql列中给出的答案就是上面提到的 

今天的文章就先写到这, 更多实战开发经验和技巧欢迎关注


http://www.kler.cn/a/430231.html

相关文章:

  • hive数据迁移
  • Openwrt @ rk3568平台 固件编译实践(二)- ledeWRT版本
  • 【2024华为OD-E卷-100分-boss的收入】(题目+思路+JavaC++Python解析)
  • 联邦学习中的LoRA:FedLoRA
  • 【Web】0基础学Web—事件对象、事件委托(事件代理)——星级评论案例
  • flutter 专题二十四 Flutter性能优化在携程酒店的实践
  • 【算法】数组中,求K个最大值
  • Advanced Functional Materials 光驱动连续跳跃机器人
  • SpringBoot【二】yaml、properties两配置文件介绍及使用
  • yocto的xxx.bb文件在什么时候会拷贝文件到build目录
  • Java设计模式 —— 【创建型模式】建造者模式详解
  • 鸿蒙 Next 可兼容运行 Android App,还支持出海 GMS?
  • VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
  • Java 设计模式~工厂模式
  • 工业—使用Flink处理Kafka中的数据_EnvironmentData2
  • 【爬虫】– 抓取原创力文档数据
  • Python 类的设计(以植物大战僵尸为例)
  • 3D Gaussian Splatting代码详解(一):模型训练、数据加载
  • 单片机 PCB 设计要点
  • 数据结构(Queue队列)
  • Linux:network:添加ip的时候自动添加一个本地路由
  • 针对一个系统的权限管理这样的业务场景,使用各设计模式解说
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-augment.py
  • MQTT消息服务器mosquitto介绍及说明
  • zerotier实现内网穿透(访问内网服务器)
  • 得物新一代可观测性架构:海量数据下的存算分离设计与实践