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 相关文章推荐
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
python使用RNN实现文本分类
May 24 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
python进程和线程用法知识点总结
May 28 Python
Python代码太长换行的实现
Jul 05 Python
Python如何实现强制数据类型转换
Nov 22 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
Python3+Flask安装使用教程详解
Feb 16 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
python三子棋游戏
May 04 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生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP实现微信提现功能
2018/09/30 PHP
Jquery优化效率 提升性能解决方案
2010/09/06 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
学习JavaScript设计模式(继承)
2015/11/26 Javascript
javascript基本算法汇总
2016/03/09 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
Python写的英文字符大小写转换代码示例
2015/03/06 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
如何用Python合并lmdb文件
2018/07/02 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python获取txt文件词向量过程详解
2019/07/05 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
keras导入weights方式
2020/06/12 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
css3使用animation属性实现炫酷效果(推荐)
2020/02/04 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
几个人围成一圈的问题
2013/09/26 面试题
个人自我鉴定
2013/11/07 职场文书
大学生社会实践方案
2014/05/11 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014公司年终工作总结
2014/12/19 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
行政主管岗位职责范本
2015/04/09 职场文书