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 会自动将数据转换成正确的格式,包括双引号。
-
确保插入的数据是字典格式:
当你使用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 格式 )
-
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列中给出的答案就是上面提到的
今天的文章就先写到这, 更多实战开发经验和技巧欢迎关注