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 全局变量的import机制介绍
Sep 07 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
详解python中的Turtle函数库
Nov 19 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
PyCharm更改字体和界面样式的方法步骤
Sep 27 Python
python爬虫实现获取下一页代码
Mar 13 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
Python如何在单元测试中给对象打补丁
Aug 03 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
php session_decode函数用法讲解
2019/05/26 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
详解Python中的__new__()方法的使用
2015/04/09 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python利用ansible分发处理任务
2015/08/04 Python
python变量不能以数字打头详解
2016/07/06 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
Python中字典和集合学习小结
2017/07/07 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python的缺点和劣势分析
2019/11/19 Python
Python如何将函数值赋给变量
2020/04/28 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
高校自主招生自荐信
2013/12/09 职场文书
师德学习感言
2014/01/31 职场文书
执行总经理岗位职责
2014/02/03 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
授权委托书怎么写
2014/04/03 职场文书
感恩的演讲稿
2014/05/06 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
Python实现智慧校园自动评教全新版
2021/06/18 Python
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
Python学习之迭代器详解
2022/04/01 Python
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技