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 相关文章推荐
深入理解Javascript中的this关键字
Mar 27 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
python中redis的安装和使用
Dec 04 Python
Python中协程用法代码详解
Feb 10 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
Apr 22 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
对Python 内建函数和保留字详解
Oct 15 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
基于Python的ModbusTCP客户端实现详解
Jul 13 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
python百行代码实现汉服圈图片爬取
Nov 23 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生成excel列序号代码实例
2013/12/24 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
yii2中添加验证码的实现方法
2016/01/09 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
详解Node.js中的事件机制
2016/09/22 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
Python 如何测试文件是否存在
2020/07/31 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
印度服装购物网站:Limeroad
2018/09/26 全球购物
工作失误检讨书范文
2015/01/26 职场文书
青岛海底世界导游词
2015/02/11 职场文书
2015年新农村建设工作总结
2015/05/22 职场文书
基层党建工作简报
2015/07/21 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android