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回溯法实现数组全排列输出实例分析
Mar 17 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
Python爬虫DNS解析缓存方法实例分析
Jun 02 Python
django 按时间范围查询数据库实例代码
Feb 11 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
Python enumerate函数功能与用法示例
Mar 01 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
Python 定义只读属性的实现方式
Mar 05 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 Python
python如何设置静态变量
Sep 07 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
星际争霸任务指南——人族
2020/03/04 星际争霸
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php中socket的用法详解
2014/10/24 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
简单谈谈Python中的闭包
2016/11/30 Python
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
美国知名的旅游网站:OneTravel
2018/10/09 全球购物
有个性的自我评价范文
2013/11/15 职场文书
八一演出活动方案
2014/02/03 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
通用自荐信范文
2014/03/14 职场文书
厨师个人自我鉴定范文
2014/04/19 职场文书
三年级小学生评语
2014/04/22 职场文书
节能减耗标语
2014/06/21 职场文书
西安导游词
2015/02/12 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
JS中一些高效的魔法运算符总结
2021/05/06 Javascript
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python