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中List.count()方法的使用教程
May 20 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
PyQt5每天必学之日历控件QCalendarWidget
Apr 19 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
Python shelve模块实现解析
Aug 28 Python
基于django micro搭建网站实现加水印功能
May 22 Python
利用Python实现Excel的文件间的数据匹配功能
Jun 16 Python
Python爬虫抓取论坛关键字过程解析
Oct 19 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 xml留言板 xml存储数据的简单例子
2009/08/24 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
php实现简单洗牌算法
2013/06/18 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
2016/07/27 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
关于微信jssdk实现多图片上传的一点心得分享
2016/12/13 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
谈谈python中GUI的选择
2018/03/01 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
微信公众号token验证失败解决方案
2019/07/22 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
django 模型中的计算字段实例
2020/05/19 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
进程的查看和调度分别使用什么命令
2015/03/25 面试题
服装厂厂长职责
2013/12/16 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
茶叶生产计划书
2014/01/10 职场文书
上课迟到检讨书
2014/02/19 职场文书
小学班主任培训方案
2014/06/04 职场文书
水电工程师岗位职责
2015/02/13 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
Python实现机器学习算法的分类
2021/06/03 Python
Python爬取某拍短视频
2021/06/11 Python