自关联是一种特殊的一对多的关系。
案例:显示广州市的上级地区和下级地区。
地区表:id, atitle, aParent_id; # (areas.sql 为批量插入语句)
mysql终端中批量执行sql语句:source areas.sql;
创建好模型类:
# 自关联的 ForeignKey 第一个参数为self
class AreaInfo(models.Model): """地区模型类""" # 地区名称 atitle = models.CharField(max_length=20) # 关联属性,代表当前地区的父级地区 aParent = models.ForeignKey('self', null=True, blank=True,on_delete=models.CASCADE)
然后通过shell生成表 ,然后进入表中查看表的结构:
有 aParent_id 的外键 # 自关联
建立视图函数,并且添加到路由中
def areas(request): """获取广州市的上级地区和下级地区""" # 1.获取广州市的信息 area = AreaInfo.objects.get(atitle='广州市') # 2.查询广州市的信息 parent = area.aParent # 3.查询广州市的下级地址 children = area.areainfo_set.all() # 一对多查询 # 使用模板 return render(request, 'booktest/areas.html', {'area': area, 'parent': parent, 'children': children})
然后在模板中使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>自关联案例</title> </head> <body> <h1>当前地区</h1> {{ area.atitle }}<br/> <h2>父级地区</h2> {{ parent.atitle }}<br/> <h3>下级地区</h3> <ul> {% for child in children %} <li>{{ child.atitle }}</li> {% endfor %} </ul> </body> </html>
运行程序展示出来