【Django】ORM关系映射

news2024/11/15 21:40:55

关系映射

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

  1. 一对一映射,如一个身份证对应一个人。

  2. 一对多映射,如一个班级可以有多个学生。

  3. 多对多映射,如一个学生可以报多个课程,一个课程可以有多个学生学习。

1 一对一映射

1.1 一对一映射定义

  • 一对一是表示现实事物间存在的一对一的对应关系。如:一个家庭只有一个户主,一个男人有一个妻子,一个人有一个唯一的身份证号等。

1.2 一对一映射创建模型

  • 语法:OneToOneField(类名,on_delete=xxx),on_delete:级联删除。

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

  • 特殊字段选项【必须】,on_delete,级联删除。

Django中的一对一映射

  1. models.CASCADE 级联删除,Django模拟SQL约束ON DELETE CASCADE的行为,并删除包含ForegnKey的对象。

  2. models.PROTECT 抛出ProtectedError 以组织被引用对象的删除,等同于 mysql 默认的RESTRICT。

  3. SET_NULL 设置 ForeignKey null,需要指定 null=True;

  4. SET_DEFAULT 将 ForeignKey 设置为其默认值,必须设置ForeignKey默认值。

代码示例:

from django.db import models
​
# 关系说明:一个人只有一个身份证号码,一个身份证号码对应一个人
# Create your models here.
class Person(models.Model):
    """
    个人类
    """
    name = models.CharField("姓名", max_length=11, default='', null=False)
    age = models.IntegerField("年龄", default=1)
    home = models.CharField("住址", max_length=256, default='')
​
    def __str__(self):
        return "%s_%s_%s" % (self.name, self.age, self.email)
​
class IdCard(models.Model):
    """
    身份证件
    """
    idCardNUmber = models.CharField("身份证号码", max_length=32, null=False)
    person = models.OneToOneField(Person, on_delete=models.CASCADE) # 一对一属性

1.3 一对一映射创建数据

# 无外键的模型类[Person]:
person = Person.objects.create(name='南歌', age=20, home='陕西省延安市')
# 有外键的模型类[IdCard]
idcard = IdCard.objects.create(idCardNUmber='xxxx', person=person)
# 也即关联个人的主键值
idcard = IdCard.objects.create(idCardNUmber='xxxx', person_id=person_id)

直接关联外键对应的对象。

数据库查看。

关联外键对应对象的主键值。

数据库查看。

1.4 一对一映射查询数据

  1. 正向查询:直接通过关联的外键属性查询,则称为正向查询。

    # 通过IdCard查找Person
    from oto.models import *
    idCard = IdCard.objects.get(idCardNUmber='xxxx')
    ​
    print("身份证号:{idCardNUmber}的人姓名为:{name}".format(idCardNUmber=idCard.idCardNUmber, name=idCard.person.name))
  2. 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方。

    注:

    • 反向关联属性为 实例对象.引用类名(小写),如个人的反向引用为 个人对象.idcard

    • 当反向引用不存在时,则会触发异常。

    # 通过IdCard查找Person
    from oto.models import *
    ​
    person = Person.objects.get(name='南歌')
    person.idcard.idCardNUmber

    反向属性不存在时,触发异常。

2 一对多映射

2.1 一对多映射定义

  • 一对多是表现现实事物间存在的一对多的对应关系。如:一个学校有多个班级,一个班级有多个学生,一本图书只能属于一个出版社,一个出版社允许出版多本图书。

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

2.2 一对多映射创建模型

  • 语法

    # 当一个A类对象可以关联多个B类对象时
    class A(models.Model):
        ...
        
    class B(models.Model):
        属性  = models.Foreignkey("一"的模型类, on_delete=xx)
    # Fortignkey 必须指定 on_delete模式

代码示例:

from django.db import models
​
# Create your models here.
# 关系说明:一个出版社可以有多本图书,一个图书只能对应一个出版社
class Press(models.Model):
    """
    出版社
    """
    name = models.CharField("名称", max_length=128, unique=True)
​
​
class Book(models.Model):
    """
    图书
    """
    name = models.CharField("书名", max_length=128)
    press = models.ForeignKey(Press, on_delete=models.CASCADE)

2.3 一对多映射创建数据

# 先创建一,再创建多
from otm.models import *
press = Press.objects.create(name="东北大学出版社")
​
Book.objects.create(name="C++教程", press=press)
Book.objects.create(name="Python教程", press_id=press_id)

2.4 一对多映射查询数据

  1. 正向查询:直接通过关联的外键属性查询,则称为正向查询。

    # 通过Book查找Press
    from otm.models import *
    book = Book.objects.get(name='Python教程')
    ​
    print("{book}的出版社是{name}".format(book=book.name, name=book.press.name))
  2. 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方。

    # 通过 Press 查找 Book
    from otm.models import *
    press = Press.objects.filter(name='东北大学出版社')
    books = press.book_set.all()

3 多对多映射

3.1 多对多定义

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

  • Mysql中创建多对多需要依赖第三张表来实现。

  • Django中无需手动创建第三张表,Django自动完成。

3.2 多对多映射创建模型

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

    属性 = models.ManyToManyField(MyModel)

  • 代码示例:

    # 关系说明:一个作者可以出版多本图书,一本图书可以被多名坐着同时编写
    ​
    from django.db import models
    ​
    # Create your models here.
    class Author(models.Model):
        name = models.CharField("作者", max_length=128)
    ​
    ​
    class Book(models.Model):
        name = models.CharField("书名", max_length=128)
        authors = models.ManyToManyField(Author)

3.3 多对多映射创建数据

# 方案一:先创建author再关联book
author1 = Author.objects.create(name="南歌")
author2 = Author.objects.create(name="EuanSu")
## 南歌和EuanSu同时写了一本《Django教程》
book = author1.book_set.create(name="Django教程")
author2.book_set.add(book)
​
# 方案二:先创建book再关联author
book = Book.objects.create(name="Python教程")
## 南歌和EuanSu都参与了《Python教程》的编写
author = book.authors.create(name="南歌")
book.authors.add(author)

3.4 多对多映射查询数据

  1. 正向查询:直接通过关联的外键属性查询,则称为正向查询。

    # 通过Book查询对应所有的 Author,此时多对多属性等价于objects
    ## 获取 book 对应的所有author信息
    book.authors.all() 
    ## 获取book对应作者中名字为南歌的author
    book.authors.filter(name="南歌")
  2. 反向查询:没有外键属性的一方,可以调用反向属性查询到关联的另一方。

    # 通过Author查询对应所有的book,利用反向属性book_set
    author.book_set.all()
    author.book_set.filter(name="Django教程")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1438945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot和PostGIS的震中影响范围可视化实践

目录 前言 一、基础数据 1、地震基础信息 2、全国行政村 二、Java后台服务设计 1、实体类设计 2、Mapper类设计 3、控制器设计 三、前端展示 1、初始化图例 2、震中位置及影响范围标记 3、行政村点查询及标记 总结 前言 地震等自然灾害目前还是依然不能进行准确的预…

解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?

作者:饶子昊、杨龙 应用复杂度提升,根因定位困难重重 随着软件技术发展迭代,很多企业软件系统也逐步从单体应用向云原生微服务架构演进,一方面让应用实现高并发、易扩展、开发敏捷度高等效果,但另外一方面也让软件应…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有…

【闲来看源码】分析一下`ArrayUtils.contains()`这个方法的实现

【闲来看源码】分析一下ArrayUtils.contains()这个方法的实现 大家先来看源码 PreAuthorize("ss.hasPermi(system:user:remove)")Log(title "用户管理", businessType BusinessType.DELETE)DeleteMapping("/{userIds}")public AjaxResult remo…

flink反压及解决思路和实操

1. 反压原因 反压其实就是 task 处理不过来,算子的 sub-task 需要处理的数据量 > 能够处理的数据量,比如: 当前某个 sub-task 只能处理 1w qps 的数据,但实际上到来 2w qps 的数据,但是实际只能处理 1w 条&#…

制作离线版element ui文档

链接:https://pan.baidu.com/s/1k5bsCK9WUlZobhFBLItw1g?pwdgeyk 提取码:geyk --来自百度网盘超级会员V4的分享 https://github.com/ElemeFE/element 克隆官方代码 使用nvm切换node版本,推荐使用14.0.0 http://doc.xutongbao.top/doc/#/zh…

田忌赛马 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 给定两个只包含数字的数组a,b,调整数组a里面数字的顺序,使得尽可能多的a[i] > b[i]。 数组a和b中的数字各不相同。输出所有可以达到最优结果的a数…

Mac M1使用PD虚拟机运行win10弹出“内部版本已过期立即安装新的windows内部版本”

一、问题 内部版本已过期立即安装新的windows内部版本 二、解决 1、如图所示打开zh-CN目录 C:\windows\system32\zh-CN找到licensingui.exe文件 将该文件重命名为licensingui_bak.exe 2、修改完成效果如下 (1)但操作中发现,需要TrustedIns…

使用阿里云一键部署 幻兽帕鲁服务器 菜鸟教程 一键快速部署

本文通过介绍如何 从购买阿里云服务器(windows系统)、到一键傻瓜式快速部署、再到连接到帕鲁服务器,简介明了,易上手,没相关专业知识的游戏玩家也能一键傻瓜式搭建服务器环境。 背景:最近很火爆的游戏《幻…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-任务管理

目录 一、任务管理1.1、任务状态1.2、任务基本概念1.3、任务管理使用说明1.4、任务开发流程1.5、任务管理接口 一、任务管理 从系统角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。 O…

设计模式巡礼:多板适配案例解析与深度重构

theme: cyanosis 月黑风高,好兄弟发给我一个重构需求,咨询我的意见。 一、 场景分析 开发的产品是需要运行到不同的定制Android板子,不同板子有对应的不同SDK提供的API,目前的业务端,业务流程基本是确定的&#xff0…

LLM大语言模型(六):RAG模式下基于PostgreSQL pgvector插件实现vector向量相似性检索

目录 HightLightMac上安装PostgreSQLDBever图形界面管理端创建DB 使用向量检索vector相似度计算近似近邻索引HNSW近似近邻索引示例 HightLight 使用PostgreSQL来存储和检索vector,在数据规模非庞大的情况下,简单高效。 可以和在线业务共用一套DB&#…

国产航顺HK32F030M: 超声波测距模块串口通信数据接收与处理

参考代码 /************************************************************************************************** * file usart_async_tx_no_int_rx_rxneint.c * brief 异步串口通信例程, 通过查询TXE标志发送数据,通过RXNE中断接收数据,当中断接收到数据后会将 * …

使用yolo训练自己的模型

YOLO(You Only Look Once)是一种用于目标检测的深度学习模型,旨在实时检测图像或视频中的多个对象。与传统的目标检测方法不同,YOLO一次性处理整个图像,而不是通过滑动窗口或区域提议进行多次检测。这种方法使得YOLO在…

2023年全国职业院校技能大赛软件测试赛题第3套

2023年全国职业院校技能大赛 软件测试赛题第3套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

微信小程序新手入门教程四:样式设计

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性,同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比,WXSS …

GPT帮别人画,就是不帮我画,我很急怎么办?

今天分享如何让GPT更听话,分享来自林杰陪伴群中的群友“友人”,分享的非常棒,是AI绘画中的高手! AI也需要奖励 虽然说AI距离完全的自主思考还有很长很长的路要走,但是各种实验表明,当我们在与AI对话时&am…

ABAP 标准状态栏GUI STATUS的快速创建

ABAP 标准状态栏GUI STATUS的快速创建 不用先创建GUI 状态 SE41

【PyQt】06-.ui文件转.py文件

文章目录 前言方法一、基本脚本查看自己的uic安装目录 方法二、添加到扩展工具里面(失败了)方法二的成功步骤总结 前言 方法一、基本脚本 将Qt Designer(一种图形用户界面设计工具)生成的.ui文件转换为Python代码的脚本。 pytho…

国考省考行测:平行结构体

国考省考行测:平行结构体 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇…