一、什么是关系映射

在关系型数据库中,通常不会把所有数据都放在同一张表中,不易于扩展,常见关系映射有:

  1. 一对一映射

    如:一个身份证对应一个人

  2. 一对多映射

    如:一个班级可以有多个学生

  3. 多对多映射

    如:一个学生可以报多个课程,一个课程可以有多个学生学习

二、一对一关系

一对一是表示现实事务见存在的一对一的对应关系

如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的指纹信息等

语法:

OneToOneFieId(类名, on_delete=xxx)

示例:

class A(models.Model):...
class B(models.Model):属性 = models.OneToOneFiele(A, on_delete=xxx)

特殊字段选项【必须】

on_delete - 级联删除

  1. models.CASCADE级联删除。Django模拟SQL约束ON DELETE CASCADE的行为,并删除包括ForeignKey的对象。
  2. models.PROTECT抛出ProtectedError以阻止被引用对象的删除;【等同于MySQL默认的RESTRICT】
  3. SET_NULL设置ForeignKey null; 需要制定null=True
  4. SET_DEFAULT将ForeignKey设置为其默认值,必须设置ForeignKey的默认值

官方文档:https://docs.djangoproject.com/en/2.2/ref/models/fields/#foreignkey

示例:创建模型类 oto/models.py

from django.db import models# Create your models here.class Author(models.Model):# 作家模型类name = models.CharField('作家', max_length=11)class Wife(models.Model):# 作家妻子模型类name = models.CharField('妻子', max_length=11)author = models.OneToOneField(Author, on_delete=models.CASCADE) # 增加一对一属性

外键字段名_id作为字段名

无外键的模型类【Author】:

author1 = Author.objects.create(name = '王老师')

有外键的模型类【Wife】:

用类属性名:

wife1 = Wife.objects.create(name = '王夫人', author = author1) # 关联王老师obj

外键字段名:

wife1 = Wife.objects.create(name = '王夫人', author_id = 1) # 关联王老师对应主键值

查询数据

  • 正向查询:直接通关外键属性查询,则成为正向查询

    # 通过wife找author
    from .models import wife
    wife = wife.objects.get(name = '王夫人')
    print(wife.name, '的老公是', wife.author.name)
    
  • 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方

    反向关联属性为实例对象.引用类名(小写),如作家的反向引力为作家对象.wifi

    当反向引力不存在时,则会触发异常

    author1 = Author.objects.get(name='王老师')
    author1.wife.name
    

三、一对多映射

一对多是表示现实事物间存在的一对多的对应关系。

如:一个学校有多个班级,一个班级有多个学生,一个图书只能属于一个出版社,一个出版社允许出版多本图书

一对多需要明确出具体角色,在多表上设置外键

语法:当一个A类对象可以关联多个B类对象时

class A(models.Model):...
class B(models.Model):属性 = models.ForeignKey("一"的模型类, on_delete=xx)

ForeignKry必须指定on_delete模式

示例:创建模型类 otm/models.py

# file : otm/models.py
from django.db import modelsclass Publish(models.Model):# 出版社【一】name = models.CharField('名称', max_length=50, unique=True)class Book(models.Model):# 书【多】title = models.CharField('书名', max_length=50, on_delete=models.CASCADE)

先创建’一’ 再创建’多’

from .models import *
pub1 = Publisher.objects.create(name = '清华大学出版社')
Book.objects.create(title = 'C++', publisher = pub1)
Book.objects.create(title = 'Java', publisher_id = 1)

查询数据

  • 正向查询【通过Book查询Publisher,通过publisher属性查询即可】

    book.publisher abook = Book.objects.get(id=1)
    print(abook.title, '的出版社是:', abook.publisher.name)
    
  • 反向查询【通过Publisher查询对应的所有的Book】

    需要用到反向属性

    # 通过出版社查询对应的书
    pub1 = Publisher.objects.get(name='清华大学出版社')
    books = pub1.book_set.all() # 通过book_set获取pub1对应的多个Book数据对象
    # books = Book.objects.filter(publisher=pub1) # 也可以采用此方式获取
    print("清华大学出版社的书有:")
    for book in books:print(book.title)
    

四、多对多映射

多对多表达对象之间多对多复杂关系,如:每个人都有不同的学校(小学、初中、高中…),每个学校都有不同的学生

  • MySQL中创建多对多需要依赖第三张表来表现
  • Django中无需手动创建第三张表,Django自动完成

语法:在关联的两个类中的任意一个类中,增加

  • 属性 = models.ManyToManyField(MyModel)

用法示例:

一个作者可以出版多本图书

一本图书可以被多名作者同时编写

class Author(models.Model):...
class Book(models.Model):...authors = models.ManyToManyField(Author)

查询数据

  1. 正向查询 有多对多属性的对象 查另一方

    通过 Book 查询所对应的所有 Author

    此时多对多属性等价于objects

    book.authors.all() → 获取book对应的所有的author的信息
    book.authors.filter(age__gt=80) → 获取book对应的做这种年龄大于80岁的作者的信息
    
  2. 反向查询

    利用Author查询对应的所有Book

    利用反向属性Book_set

    author.book_set.all()
    author.book_set.filter()
    

14. Django基础:关系映射相关推荐

  1. Django day06 关系映射

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

  2. Nhibernate 基础关系映射

    多对一 <many-to-one name="OrderEntity" column="OrderID" class="MedicalSyste ...

  3. pathon Django的关系映射

    一对一    [创建] 一对一是表示现实事物间存在的一对一的对应关系. 特殊字段选项    [必须] on_delete - 级联删除 更多参考 模型字段参考 | Django 文档 | Django ...

  4. Django的关系映射

    1.一对一 夫妻场景,众所周知,一夫一妻 class Husband(models.Model):name = models.CharFiled('名字',default='')wife = mode ...

  5. 学一点django基础

    学一点Django基础 目录 文章目录 目录 一.Django框架的介绍 Django的安装 Django框架开发 创建项目的指令 Django项目的目录结构 URL 介绍 视图函数(view) Dj ...

  6. day 65 Django基础一之web框架的本质

    Django基础一之web框架的本质 django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Dja ...

  7. Django的ORM映射机制与数据库实战

    一.ORM(Object Relational Mapping) 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存 ...

  8. Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)

    阅读目录 摘要: Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse.render.redirect) 一.Web框架概述: Python三大 ...

  9. python路由编程_Python Django基础二之URL路由系统

    MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  10. Web框架之Django_01初识(三大主流web框架、Django安装、Django项目创建方式及其相关配置、Django基础三件套:HttpResponse、render、redirect)...

    摘要: Web框架概述 Django简介 Django项目创建 Django基础必备三件套(HttpResponse.render.redirect) 一.Web框架概述: Python三大主流Web ...

最新文章

  1. 2021-2027年中国中空纤维膜行业市场研究及前瞻分析报告
  2. 英语中那些缺钱的表达~
  3. NR 5G NAS非接入层
  4. linux 内核调试方法
  5. 使用Spring Boot Operator部署SpringBoot到K8S
  6. linux终端python自动提示
  7. c++:warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
  8. duilib加载资源
  9. ibm+i+to+mysql_IBM 的数据库Informix 常用代语法
  10. 夜曲歌词 拼音_周杰伦夜曲的歌词
  11. nginx 同一服务器部署多个网站
  12. 蕴含深刻道理的经典语录
  13. Android Studio导入外部资源的三种方式
  14. 『NLP学习笔记』Cross Entropy Loss 的硬截断、软化到 Focal Loss
  15. win常用快捷键 和 Dos(cmd)快捷键
  16. 计算机里没有四款小游戏,电脑里一些隐藏在程序里有趣的小游戏
  17. 抖音主页如何添加官网链接
  18. 5.22非常虚伪的集训总结
  19. 嵌入式系统主要应用于哪些行业中?(可就业方向)
  20. 到底什么是非线性规划?

热门文章

  1. 21.Linux/Unix 系统编程手册(上) -- 信号:信号处理器函数
  2. 93. php 命名空间(3)
  3. 用css样式修改input控件和button控件
  4. MariaDB用户管理
  5. linux 一次对一个用户限制存取
  6. hdu 6155 - Subsequence Count
  7. ORACLE设置自动递增的方法
  8. String 尺取法
  9. 64位sql server 如何使用链接服务器连接Access
  10. ORA-12514: TNS:listener does not currently know of service …