关联的查询

  • 在定义模型类时,可以指定三种关联关系,最常用的是一对多关系,如本例中的“图书-英雄”就为一对多关系,接下来进入shell练习关系的查询
python manage.py shell
  • 查询编号为1的图书
book=BookInfo.books.get(pk=1)
  • 获得book图书的所有英雄
book.heroinfo_set.all()

根据一找多

  • 获得编号为1的英雄
hero=HeroInfo.objects.get(pk=1)
  • 获得hero英雄出自的图书
hero.hbook

根据多找一

自关联

  • 对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以可以设计成一张表,内部的关系字段指向本表的主键,这就是自关联的表结构
  • 打开booktest/models.py文件,定义AreaInfo类
  • 说明:关系属性使用self指向本类,要求null和blank允许为空,因为一级数据是没有父级的
#定义地区模型类,存储省、市、区县信息
class AreaInfo(models.Model):
    atitle=models.CharField(max_length=30)#名称
    aParent=models.ForeignKey('self',null=True,blank=True)#关系
  • 迁移
python manage.py makemigrations
python manage.py migrate

迁移

  • 打开mysql命令行,导入数据
source areas.sql
  • 打开booktest/views.py文件,定义视图area
from models import AreaInfo
...
#查询广州市的信息
def area(request):
    area = AreaInfo.objects.get(pk=440100)
    return render(request, 'booktest/area.html', {'area': area})
  • 打开booktest/urls.py文件,新建一条url
urlpatterns = [
    ...
    url(r'^area/$', views.area),
]
  • 在templates/booktest目录下,新建area.html文件
<html>
<head>
    <title>地区</title>
</head>
<body>
当前地区:{{area.atitle}}
<hr/>
上级地区:{{area.aParent.atitle}}
<hr/>
下级地区:
<ul>
    {%for a in area.areainfo_set.all%}
    <li>{{a.atitle}}</li>
    {%endfor%}
</ul>
</body>
</html>
  • 运行服务器
python manage.py runserver
  • 在浏览器中输出效果如下图

广州市