首页 > 其他分享 >Django中JSONField的模糊查询

Django中JSONField的模糊查询

时间:2023-09-06 21:11:54浏览次数:40  
标签:customer __ Django name region 查询 JSON address JSONField

项目需求 多个条件并联模糊查询

 筛选条件中需要使用OR查询 于是用Q对象查询 先说结果 使用 字段名__键名__icontains=keyword 解决

# 客户地址表
class UserAddress(models.Model):
"""
用户地址表
region 所在地区
{
"address":"详细地址",
"city_code":"市级code",
"city_name":"市级名称",
"district_code":"区级code",
"district_name":"区级名称",
"province_code":"省级code",
"province_name":"省级名称"
}
"""

address_id = models.AutoField(primary_key=True)
receiving_unit = models.CharField(max_length=32) # 收货单位
consignee = models.CharField(max_length=8) # 收货人
phone_number = models.CharField(max_length=11) # 手机号码
region = models.JSONField(default=dict) # 所在地区
is_default = models.BooleanField(default=0) # 是否默认收货地址(默认否)
user = models.ForeignKey(CustomerManagement, **MP, related_name="user_address")
using = models.BooleanField(default=1)
create_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)

class Meta:
db_table = "customer_address"

q_condition = Q(consignee__contains=keyword) | Q(receiving_unit__contains=keyword) | Q( phone_number__contains=keyword) | Q(region__province_name__icontains=keyword) | Q( region__city_name__icontains=keyword) | Q(region__city_name__icontains=keyword) | Q( region__address__icontains=keyword)

开始选择的是contains 结果查询结果为空 也就是说被筛选掉了 查看原SQL

SELECT `customer_address`.`address_id`, `customer_address`.`receiving_unit`, `customer_address`.`consignee`, `customer_address`.`phone_number`, `customer_address`.`region`, `customer_address`.`is_default`, `customer_address`.`user_i
d` FROM `customer_address` WHERE ((`customer_address`.`consignee` LIKE BINARY %湖% OR `customer_address`.`receiving_unit` LIKE BINARY %湖% OR `customer_address`.`phone_number` LIKE BINARY %湖% OR JSON_CONTAINS(JSON_EXTRACT(`customer
_address`.`region`, $."province_name"), "\u6e56") OR JSON_CONTAINS(JSON_EXTRACT(`customer_address`.`region`, $."city_name"), "\u6e56") OR JSON_CONTAINS(JSON_EXTRACT(`customer_address`.`region`, $."city_name"), "\u6e56") OR JSON_CONTAINS(JSON_EXTRACT(`customer_address`.`region`, $."address"), "\u6e56")) AND `customer_address`.`user_id` = 4 AND `customer_address`.`using`)

心里咯噔一下 怎么是编码后的

于是开始百度.......各种contains语法都试了一遍 实在是不行 本来是准备直接写原生SQL的 最后看到了这位网友发的这个

 于是试了试 成功查询到数据 再看SQL

SELECT `customer_address`.`address_id`, `customer_address`.`receiving_unit`, `customer_address`.`consignee`, `customer_address`.`phone_number`, `customer_address`.`region`, `customer_address`.`is_default`, `customer_address`.`user_i
d` FROM `customer_address` WHERE ((`customer_address`.`consignee` LIKE BINARY %湖% OR `customer_address`.`receiving_unit` LIKE BINARY %湖% OR `customer_address`.`phone_number` LIKE BINARY %湖% OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(`cus
tomer_address`.`region`, $."province_name"))) LIKE LOWER(%湖%) OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(`customer_address`.`region`, $."city_name"))) LIKE LOWER(%湖%) OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(`customer_address`.`region`, $."city_name"))) LIKE LOWER(%湖%) OR LOWER(JSON_UNQUOTE(JSON_EXTRACT(`customer_address`.`region`, $."address"))) LIKE LOWER(%湖%)) AND `customer_address`.`user_id` = 4 AND `customer_address`.`using`)

并未编码 于是再次百度 查查原因

 至此 问题解决 有空再往下继续探索查看 记录一下

标签:customer,__,Django,name,region,查询,JSON,address,JSONField
From: https://www.cnblogs.com/missyun/p/17683378.html

相关文章

  • mysql集合查询
    统计一个班级共有多少学生?selectcount(*)ASnumsfromstudent;统计数学成绩大于90分的学生有多少个?selectcount(*)ASnumsfromstudentwheremath>=90;统计总分大于250分的人数有多少?selectcount(*)ASnumsfromstudentwhere(math+chinese+englist)>250;查看表的创建......
  • 数据库查询语句配例题(一)
    普通查询查询全部列数据语法:select*from表名;select-表示查询哪些字段from-表示来自哪些表*-表示所有列例:查询emp表中全部列数据:select*fromemp;查询指定列数据语法:select列名1,列名2,……from表名;例:查询student表中,学员编号(sid),姓名......
  • 数据库查询某个内容所在的表
    可以通过查询数据库的系统表信息来查找某个内容所在的表。对于大多数关系型数据库管理系统,都会有一系列系统表,用于存储数据库元数据信息(比如表、列、索引等)。你可以使用SQL查询语句在这些系统表中查找包含特定内容的列名、表名或者其他元素。具体来说,以下是一些常用的系统表和查......
  • [数据库] SQL特定查询场景之时间段切分方法
    1序言大数据项目、数据分析场景中,经常遇到需要切分时段的需求。如下是一些项目上的经验总结。2实时数仓即席查询场景的解决方法2.1函数拼接法方法特点:时间数据以时间戳形式存储在数据库,而非以时间字符串查询时实时运算时间段基于此,支持根据终端用户所处位置/时区......
  • 慢查询日志
    慢查询日志要开启MySQL慢查询日志,可以按照以下步骤进行操作: 编辑MySQL的配置文件my.cnf(或者my.ini),找到[mysqld]部分。vi/etc/my.cnf在[mysqld]部分添加以下配置:slow_query_log=1slow_query_log_file=/var/log/mysql/slow_query.loglong_query_time=2log_queries......
  • 优化mysql大数据量查询:范围条件与限制结果集的比较
    引言:在处理大数据量的MySQL查询时,优化查询性能是至关重要的。当数据量达到上亿级别时,选择合适的查询条件和方法可以显著影响查询效率和响应时间。本篇博客将重点探讨范围条件查询和限制结果集的两种常见查询方式,并比较它们在大数据场景下的性能差异。范围条件查询:范围条件查询是......
  • ArcGIS Map SDK FeatureLayer点击查询要素与弹框展示
    ArcGISMapSDKFeatureLayer点击查询要素与弹框展示代码如下:<htmllang="en"><head><metacharset="utf-8"/><metaname="viewport"content="initial-scale=1,maximum-scale=1,user-scalable=no&quo......
  • 查询分组后id最大的一条记录
    Linux系统-部署-运维系列导航 --连表SELECTt.*fromtest_tabletinnerjoin(selectt1.`name`,max(t1.id)idfromtest_tablet1groupbyt1.`name`)t2ont.id=t2.id; --子查询SELECTt.*fromtest_tabletwheret.id=(selectmax(t1.id)idfro......
  • linux日志文件的查询方式
    cdlog到指定log日志文件目录ls查看当前文件存在的目录catjujube.log可以查看较小的日志文件vijujube.log查看较大的日志文件(常用)/(查询的字符)可以定位到这个字符的位置N继续向下检索:$回到日志文件的最底层可以用于从底层开始查找使用:$后配合使......
  • pycharm打开django项目
    1、file-open,用pycharm加载django项目2、打开后,点击setting配置环境   file--setting--PythonInterpreter--配置python解析器    3、找到django项目的manage.py文件,运行manage.py文件4、点开配置,parameters:runserver           ......