Django自关联实现多级联动查询实例


Posted in Python onMay 19, 2020

1 问题引出

我们在开发网站的时候可能会遇到这种情况,多个字段之间有一定的关联性,比如省市县,选择省,之后下一个选择框的值则为该省的市集合,选择市之后下一个选择框的值为该市的县集合。

一种实现方式是,建立三个模型表,用外键一对多方式,显然这样是不太合理的。Django提供了自关联的实现,模型自身关联,即一条数据关联另一条数据。

本文以省市县为案例介绍其具体实现方法。

2 具体实现

2.1 建立数据表Model

在model.py中建立数据表

class AdressInfo(models.Model):
  address = models.CharField(max_length = 200, null = True, blank = True, verbose_name = ‘地址')
  pid = models.ForeignKey(‘self' , null = True, blank = True, verbose_name = ‘自关联')

  def __str__(self):
    return self.adress

说明:

name :省市县的名字
pid:外键,self自关联,这里也可以使用 AdressInfo
null:为True表示可以为空,因为省级行政单位没有父级
blank:为True表示admin后台数据写入的时候可以允许为空

然后迁移数据库

python manage.py makemigrations
python manage.py migrate

这时可以在后台数据表中添加数据

2.2 后端url和view函数

将前端网页地址映射为对应函数,用正则表达式获取前端传输的pid

url.py 文件

urlpatterns = [
  url(r'^addr/(\d+)$', Address.addrAPI, name = 'Addr)
]

view.py 文件

def addrAPI(request,addr_id): # 接收一个参数的id,指model中的pid属性对应的字段
  if (int(addr_id) == 0): # 为0表示查询省,省的pid_id为null
    address_data = AddressInfo.objects.filter(pid__isnull = True).values('id','address')
  else: # 查询市或其他县
    address_data = AddressInfo.objects.filter(pid_id = int(addr_id)).values('id','address')

  area_list = []
  for a in address_data:
    area_list.append({'id':a['id'], 'address':a['address']})

  return JsonResponse(area_list, safe = False)

2.3 前端template

前端主要是显示和执行操作相应,具体实现是通过下拉框值的改变触动相应函数。这里只写关键的地方。

address.html 文件

<body>
  <select id = 'pro'>
    <option value=''>请选择省</option>
  </select>
  <select id = 'city'>
    <option value=''>请选择市</option>
  </select>
  <select id = 'dis'>
    <option value=''>请选择县</option>
  </select>
</body>

<script>
address = function(a, b)
{
  $.get('/addr/'+a, function (dic){
    $.each(dic, function(index, item){
      b.append('<option value="' + item.id + '">' + item.address + '</option>')
    })
  })
}

$(function (){
  // 获取省市县元素
  pro = $('#pro')
  city = $('#city')
  dis = $('#dis')

  // 查询省信息
  address(0, pro)

  // 根据省查询市信息
  pro.change(function(){
    city.empty().append('<option value="">请选择市</option>');
    dis.empty().append('<option value="">请选择县</option>');
    adress(this.value, city)
  })
  // 根据市查询县信息
  city.change(function(){
    dis.empty().append('<option value="">请选择县</option>');
    adress(this.value, dis)
  })
})
</script>

3 效果

Django自关联实现多级联动查询实例

Django自关联实现多级联动查询实例

以上这篇Django自关联实现多级联动查询实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
Python基于PycURL自动处理cookie的方法
Jul 25 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
python-docx修改已存在的Word文档的表格的字体格式方法
May 08 Python
python对html过滤处理的方法
Oct 21 Python
详解django中url路由配置及渲染方式
Feb 25 Python
Python实现合并excel表格的方法分析
Apr 13 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 #Python
django 数据库返回queryset实现封装为字典
May 19 #Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 #Python
python 数据分析实现长宽格式的转换
May 18 #Python
如何把外网python虚拟环境迁移到内网
May 18 #Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 #Python
pandas dataframe 中的explode函数用法详解
May 18 #Python
You might like
php预定义变量使用帮助(带实例)
2013/10/30 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
js验证表单第二部分
2006/11/25 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
Vue+Bootstrap实现简易学生管理系统
2021/02/09 Vue.js
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python性能提升之延迟初始化
2016/12/04 Python
Python中super函数的用法
2017/11/17 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
python实现猜拳小游戏
2020/04/05 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
python numpy库np.percentile用法说明
2020/06/08 Python
基于python实现操作git过程代码解析
2020/07/27 Python
python代码实现猜拳小游戏
2020/11/30 Python
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
爱心捐款倡议书
2014/04/14 职场文书
白血病募捐倡议书
2014/05/14 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
公司备用金管理制度
2015/08/04 职场文书
教你怎么用PyCharm为同一服务器配置多个python解释器
2021/05/31 Python
关于MySQL中explain工具的使用
2023/05/08 MySQL