使用SoapUI测试webservice接口详细步骤
360
2022-08-31
Django(part32)--一对一映射(django映射数据库)
学习笔记,仅供参考
文章目录
数据表关联关系映射
一对一映射
语法创建一对一的数据记录查询作用
举个例子
数据表关联关系映射
在关系型数据库中,通常不会把所有数据都放在同一张表中,这样做会额外占用内存空间,这时,我们会使用表关联对各个数据表进行联结。
常用的表关联方式有三种:
一对一映射(如: 一个身份证对应一个人)一对多映射(如: 一个班级可以有多个学生)多对多映射(如: 一个学生可以报多个课程,一个课程可以有多个学生学习)
一对一映射
一对一是表示事物之间存在的一对一的对应关系。
语法
#主类class A(model.Model): ...#从属类class B(model.Model): 属性 = models.OneToOneField(A)
例子(作家和作家伴侣类)
#models.pyfrom django.db import modelsclass Author(models.Model): '''作家模型类''' name = models.CharField('作家', max_length=50)class Partner(models.Model): '''作家伴侣模型类''' name = models.CharField("伴侣", max_length=50) author = models.OneToOneField(Author) # 增加与作家的一对一属性
创建一对一的数据记录
from bookstore import modelsauthor1 = models.Author.objects.create(name='黄永祥')partner1 = models.Partner.objects.create(name='黄夫人', author=author1)#关联黄永祥作家author2 = models.Author.objects.create(name='王军') # 一对一关系中,主类对象可以没有对应的从属类对象
查询
在Partner对象中,通过author属性找到对应的author对象;
在Author对象中,通过 partner属性找到对应的partner对象.
正向查询
直接通过关联属性查询即可:
# 通过partner找authorfrom bookstore import modelspartner = models.Partner.objects.get(name='黄夫人')print(partner.name, '的伴侣是', partner.author.name)
反向查询
反向查询为通过反向引用属性查询,反向引用属性为实例对象.引用类名(引用类名要小写),如作家的反向引用为作家对象.partner,需要注意的是,当反向引用不存在时,则会触发异常
#author可以通过author.partner查找partner,如果没有对应的partner则触发异常author1 = models.Author.objects.get(name='黄永祥')print(author1.name, '的伴侣是', author1.partner.name)author2 = models.Author.objects.get(name='王军')try: print(author2.name, '的伴侣是', author2.partner.name)except: print(author2.name, '还没有伴侣')
作用
一对一映射主要是解决数据的存储问题,把经常加载的一个数据放在主表中,不常用数据放在另一个副表中,这样,在访问主表数据时就不需要加载副表中的数据,以提高访问速度和节省内存空间,如经常把书的内容和书名建成两张表,因为在网站上经常访问书名等信息,但不需要得到书的内容。
举个例子
首先,我们在models.py中创建一个Partner模型类,并作为Author类的从属类,形成一对一关系:
class Partner(models.Model): '''作家伴侣模型类''' name = models.CharField("姓名", max_length=50) age = models.IntegerField("年龄", null = False, default = 1) author = models.OneToOneField(Author, on_delete = models.CASCADE)
记得做一下迁移:
F:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py makemigrationsMigrations for 'bookstore': bookstore\migrations\0006_auto_20200621_2334.py - Alter field age on author - Create model PartnerF:\MyStudio\PythonStudio\goatbishop.project01\Django\mywebsite_db>python manage.py migrateOperations to perform: Apply all migrations: admin, auth, bookstore, contenttypes, sessionsRunning migrations: Applying bookstore.0006_auto_20200621_2334... OK
需要注意的是,如果我们在OneToOneField中没有加参数on_delete=models.CASCADE,则在使用python manage.py makeigrations 进行迁移时就会报错。如果我们加入这个参数,则在删除主表的数据时,从表中的数据也会随之删除。
现在,打开Django shell创建记录:
from bookstore import modelsauthor1 = models.Author.objects.create(name='黄永祥', age = 40, email="yxhuang@163.com")partner1 = models.Partner.objects.create(name='黄夫人', age = 39, author=author1)#关联黄永祥作家author2 = models.Author.objects.create(name='王军', age = 36, email="wangjun@163.com")
再查看一下mywebdb数据库中 bookstore_partner表和bookstore_author表:
mysql> select * from bookstore_author;+----+--------+-----+----------------------+| id | name | age | email |+----+--------+-----+----------------------+| 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 |+----+--------+-----+----------------------+7 rows in set (0.00 sec)mysql> select * from bookstore_partner;+----+--------+-----+-----------+| id | name | age | author_id |+----+--------+-----+-----------+| 1 | 黄夫人 | 39 | 8 |+----+--------+-----+-----------+1 row in set (0.00 sec)
我们看到bookstore_partner表中黄夫人的author_id字段值为8,它对应着bookstore_author表中的id值8
我们再做一些查询工作:
#正向partner = models.Partner.objects.get(name='黄夫人')print(partner.name, '的伴侣是', partner.author.name)#反向author1 = models.Author.objects.get(name='黄永祥')print(author1.name, '的伴侣是', author1.partner.name)author2 = models.Author.objects.get(name='王军')try: print(author2.name, '的伴侣是', author2.partner.name)except: print(author2.name, '还没有伴侣')
输出:
黄夫人 的伴侣是 黄永祥黄永祥 的伴侣是 黄夫人王军 还没有伴侣
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~