django3文档,django笔记
学习笔记,仅供参考。
本文通过目录表、关系映射、一对一映射语法,创建一对一的数据记录查询功能,给出了实例。
数据表关联映射
在关系数据库中,所有的数据通常不会放在同一个表中,这样会占用额外的内存空间。这时,我们将使用表关联来连接各种数据表。
常见的表关联形式有三种:一对一映射(比如一个身份证对应一个人)、一对多映射(比如一个班可以有多个学生)、多对多映射(比如一个学生可以报多个课程,一个课程可以有多个学生学习)。
一对一映射
一一对应是指事物之间一一对应。
语法
#主类
A级(型号。型号):
.
#依赖类
B级(型号。型号):
attribute=models . onetoonfield(a)
示例(作家和作家的同伴类)#models.py
从django.db导入模型
类作者(模型。型号):
编写器模型类
名称=型号。CharField (writer ,max_length=50)
班级伙伴(模特。型号):
作家的同伴模型类
名称=型号。CharField (partner ,max_length=50)
作者=模特。OneToOneField(作者)
#添加与编写器一对一的属性
创建一对一的数据记录
从书店导入模型
author 1=models . author . objects . create(name=黄永祥)
1=models . partner . objects . create(name=黄女士,author=author1)
#与黄永祥有关的作家
author 2=models . author . objects . create(name= Wang Jun )
#在一对一的关系中,主类对象可以没有对应的从属类对象。
询问
在伙伴对象中,通过author属性找到对应的author对象;
在Author对象中,通过partner属性找到对应的partner对象。
正向查询可以直接通过关联属性查询来完成:
#通过合作伙伴查找作者
从书店导入模型
partner=models . partner . objects . get(name=黄太太)
print的partner(partner . name, is ,partner.author.name)是反向查询,反向引用属性是实例对象。引用类名(引用类名应为小写),例如,如果编写器的反向引用是编写器对象。伙伴,需要注意的是,反向引用不存在时会触发异常。
#author可以通过author.partner找到合作伙伴,如果没有对应的合作伙伴,就会抛出异常。
author 1=models . author . objects . get(name=黄永祥)
Print(author1.name,的合作伙伴是,author1.partner.name)
author 2=models . author . objects . get(name= Wang Jun )
尝试:
Print(author2.name,的合作伙伴是,author2.partner.name)
除了:
Print(author2.name,“还没有合作伙伴”)
功能
一对一映射主要是解决数据存储的问题。一个频繁加载的数据放在主表中,另一个不常用的数据放在另一个副表中。这样,在访问主表中的数据时,就不需要加载副表中的数据,从而提高了访问速度,节省了内存空间。比如书的目录和书名,往往是建在两个表里面,因为网站上经常会访问书名等信息,但是书的目录是不需要的。
例如
首先,我们在models.py中创建一个伙伴模型类,作为Author类的从属类,形成一对一的关系:
班级伙伴(模特。型号):
作家的同伴模型类
名称=型号。CharField (name ,max_length=50)
年龄=模特。IntegerField (age ,null=False,
默认值=1)
author=models . one toon field(author,on _ delete=models.cascade)记得进行迁移:
f:\ my studio \ python studio \ goat bishop . project 01 \ Django \ my website _ db python manage . py make migrations
“书店”的迁移:
书店\迁移\0006_auto_20200621_2334.py
-更改作者的字段年龄
-创建模型合作伙伴
f:\ my studio \ python studio \ goat bishop . project 01 \ Django \ my website _ db python manage . py migrate
要执行的操作:
应用所有迁移:管理、验证、书店、内容类型、会话
运行迁移:
应聘书店。0006_auto_20200621_2334.好需要注意的是,如果我们在一对一字段中没有加参数on _ delete=模型。级联,则在使用python manage.py makeigrations进行迁移时就会报错。如果我们加入这个参数,则在删除主表的数据时,从表中的数据也会随之删除。
现在,打开姜戈壳牌公司创建记录:
从书店导入模型
作者1=模型Author.objects.create(name=黄永祥,年龄=40,邮箱=yxhuang@163.com’)
合作伙伴1=模型Partner.objects.create(name=黄夫人,年龄=39,作者=作者1)
#关联黄永祥作家
作者2=模型Author.objects.create(name=王军,年龄=36,邮箱=王俊@ 163 . com’)再查看一下mywebdb数据库中书店_合作伙伴表和书店_作者表:
MySQL select * from bookstore _ author;
- - - -
id 姓名年龄电子邮件
- - - -
1 山羊20 goatbishop@gamil.com
2 小黄11 1033794241@qq.com
5 小黑13 xiaohei@gmail.com
6 小白19 xiaobai@gmail.com
7 山羊哥28 biggoat@gmail.com
8 黄永祥40 yxhuang@163.com
9 王军36 wangjun@163.com
- - - -
一组七行(0.00秒)
MySQL select * from book store _ partner;
- - - -
id 姓名年龄作者id
- - - -
1 黄夫人 39 8
- - - -
集合中的一行(0.00秒)我们看到书店_合作伙伴表中黄夫人的作者编号字段值为8,它对应着书店_作者表中的编号值8
我们再做一些查询工作:
#正向
合作伙伴=模特Partner.objects.get(name=黄夫人)
print(partner.name,的伴侣是,partner.author.name)
#反向
作者1=模型Author.objects.get(name=黄永祥)
print(author1.name,的伴侣是,author1.partner.name)
作者2=模型Author.objects.get(name=王军)
尝试:
print(author2.name,的伴侣是,author2.partner.name)
除了:
print(author2.name,还没有伴侣)输出:
黄夫人的伴侣是黄永祥
黄永祥的伴侣是黄夫人
王军还没有伴侣
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。