学习笔记,仅供参考


文章目录

  • 数据表关联关系映射
    • 一对一映射
      • 语法
      • 创建一对一的数据记录
      • 查询
      • 作用
    • 举个例子

数据表关联关系映射

在关系型数据库中,通常不会把所有数据都放在同一张表中,这样做会额外占用内存空间,这时,我们会使用表关联对各个数据表进行联结。

  • 常用的表关联方式有三种:

    • 一对一映射(如: 一个身份证对应一个人)

    • 一对多映射(如: 一个班级可以有多个学生)

    • 多对多映射(如: 一个学生可以报多个课程,一个课程可以有多个学生学习)

一对一映射

一对一是表示事物之间存在的一对一的对应关系。

语法

#主类
class A(model.Model):...#从属类
class B(model.Model):属性 = models.OneToOneField(A)
  • 例子(作家和作家伴侣类)
#models.py
from 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 models
author1 = 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找author
from bookstore import models
partner = 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 makemigrations
Migrations 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 migrate
Operations to perform:Apply all migrations: admin, auth, bookstore, contenttypes, sessions
Running migrations:Applying bookstore.0006_auto_20200621_2334... OK

需要注意的是,如果我们在OneToOneField中没有加参数on_delete=models.CASCADE,则在使用python manage.py makeigrations 进行迁移时就会报错。如果我们加入这个参数,则在删除主表的数据时,从表中的数据也会随之删除。

现在,打开Django shell创建记录:

from bookstore import models
author1 = 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, '还没有伴侣')

输出:

黄夫人 的伴侣是 黄永祥
黄永祥 的伴侣是 黄夫人
王军 还没有伴侣

Django(part32)--一对一映射相关推荐

  1. Django day06 关系映射

    目录 1.关系映射 1.一对一映射 2.一对多映射 3.多对多映射 练习代码https://blog.csdn.net/zh__quan/article/details/82155617 1.关系映射 ...

  2. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)

    一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射 ...

  3. MyBatis-20MyBatis高级结果映射【一对一映射(4种方式)】

    文章目录 概述 需求 方式一:使用自动映射处理一对一映射 实体类改造 UserMapper接口增加接口方法 UserMapper.xml增加SQL 单元测试 方式二:使用resultMap配置一对一映 ...

  4. Hibernate一对一映射示例注释

    Hibernate一对一映射示例注释 今天我们将研究Hibernate中的一对一映射.我们将使用Annotation和XML配置来研究Hibernate One To One Mapping示例. 目 ...

  5. 双向关联一对一映射详解(1)

    一.双向主键关联 双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行<one-to-one>的配置,另外还要在主映射的主键一端采用forei ...

  6. 双向关联一对一映射详解(2)

    二.双向外键关联 双向的外键关联可以理解为外键关联的一种特殊情况,这种特殊主要是由于它是一种双向的对应关系,在前篇文章中提到如果想要在一张表中添加一个外键字段的话可以使用<many-to-one ...

  7. python实现一对一聊天_vue+django实现一对一聊天功能

    vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊 ...

  8. Hibernate中的一对一映射

    1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...

  9. hibernate注释映射_Hibernate一对一映射示例注释

    hibernate注释映射 Today we will look into One to One Mapping in Hibernate. We will look into Hibernate O ...

最新文章

  1. jquery鼠标滑过展示图片时显示详情
  2. Kaggle知识点:数据分析EDA
  3. 高通公司 MSM8K GPT异常原因分析无法开机的问题
  4. php启用openssl,php开启openssl的方法
  5. mysql序列号生成_一文看懂mycat的6种全局序列号实现方式
  6. 黑白棋子的移动(信息学奥赛一本通-T1327)
  7. 16-mysql-dml语言-增删改数据
  8. Misc杂项设备驱动框架
  9. 几个与IP地址类型有关的术语
  10. python 代码命令大全-用什么库写 Python 命令行程序(示例代码详解)
  11. Eclipse快捷键(转载)
  12. t分布 u分布 卡方分布_u分布(u分布和t分布)
  13. jtopo更改节点选中框的颜色
  14. 斐讯N1强制刷机-免拆版
  15. 二项分布(一种离散分布)
  16. C++ 图书馆管理系统
  17. 差分放大电路及动态分析
  18. The Heads-Up Grid 让你的HTML页面具有辅助线网格功能
  19. 怎么彻底处理windows下遇到的广告流氓软件例如:双11天喵、霸业传奇、贪玩蓝约等
  20. python不解压读取zip压缩包图片

热门文章

  1. php+mysql+into_PHP+Mysql 如何实现数据库增删改查
  2. 如何使用matlab得出pid控制参数值,基于MATLAB的PID控制器参数整定及仿真
  3. docker容器内开启22 ssh_在docker容器中开启ssh服务 (未成功有时间再验证)
  4. redis 存储数据不设置过期时间 会自动过期吗_Redis-数据淘汰策略持久化方式(RDB/AOF)Redis与Memcached区别...
  5. Chrome的console
  6. JSP中获取HTML中的中文内容是乱码的解决方法---开发中遇到的问题
  7. MySQL学习笔记(二):MyISAM 存储引擎
  8. 随机模块random、os模块、sys模块、shutil模块
  9. 关于Docker你应该知道的10件事
  10. “雪崩”崩了 欧洲国际刑警组织捣毁大规模恶意软件管理平台