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中用Decorator来简化元编程的教程
Apr 13 Python
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
Python pass详细介绍及实例代码
Nov 24 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
Django+Ajax+jQuery实现网页动态更新的实例
May 28 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
python制作朋友圈九宫格图片
Nov 03 Python
django使用xadmin的全局配置详解
Nov 15 Python
五分钟带你搞懂python 迭代器与生成器
Aug 30 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 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开发大型项目的一点经验
2006/10/09 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
php多文件上传实现代码
2014/02/20 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP实现批量生成App各种尺寸Logo
2015/03/19 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
表单的一些基本用法与技巧
2006/07/15 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
vue项目中使用Svg的方法
2018/10/24 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
Python生成验证码实例
2014/08/21 Python
python编写Logistic逻辑回归
2020/12/30 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
如何使用python操作vmware
2019/07/27 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
英国标准协会商店:BSI Shop
2019/02/25 全球购物
高级电工工作职责
2013/11/21 职场文书
前台领班岗位职责
2013/12/04 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
中学总务处工作总结
2015/08/12 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL