Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

在这里插入图片描述

系列文章目录

  • Django入门全攻略:从零搭建你的第一个Web项目
  • Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作
  • Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
  • Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
  • 还在写0.0…

文章目录

  • 系列文章目录
  • 前言
  • 一、多对一关系
    • 1.多对一关系是什么
    • 2.多对一关系的增删改操作
    • 3.多对一的正向查询
    • 4.多对一的反向查询
  • 二、一对一关系
    • 1.一对一关系是什么
    • 2.一对一关系的增删改操作
    • 3.一对一关系正向查询
    • 4.一对一关系反向查询
  • 三、多对多关系
    • 1.多对多关系是什么
    • 2.多对多关系的外键添加操作
    • 3.多对多关系的外键移除工作
    • 4.多对多关系的修改和查询


前言

    在Django开发中,数据关系的管理至关重要。今天,我们将快速了解Django ORM如何处理多对一、一对一和多对多这三种核心数据关系。这些基础知识将帮助你更高效地构建数据库驱动的应用。让我们一起探索Django ORM的奥秘吧!


一、多对一关系

1.多对一关系是什么

Django使用django.db.models.ForeignKey定义多对一关系。

博客表—用户表 - - - 多对一

# app/model.py
class UserModel(models.Model):name = models.CharField(max_length=50)age = models.IntegerField()height = models.DecimalField(max_digits=3, decimal_places=2)def __str__(self):return self.nameclass Meta:db_table = 'users'class BlogModel(models.Model):title = models.CharField(max_length=100)content = models.TextField()pub_date = models.DateField()address = models.CharField(max_length=50)user = models.ForeignKey(to=UserModel, on_delete=models.CASCADE)def __str__(self):return self.titleclass Meta:db_table = 'blogs'

2.多对一关系的增删改操作

增:

    # 1.添加useru1 = UserModel.objects.create(name="王五", age=18, height=1.78)# 2.为 id(pk) = 1的用户添加blogu2 = UserModel.objects.get(pk=1)blog = BlogModel()blog.title = "ORM关联模型"blog.content = "多对一、一对一、多对多模型"blog.pub_date = "2024-05-31"blog.address = "csdn"blog.user = u2blog.save()

改:

    # 1.修改用户信息# u3 = UserModel.objects.get(id=1)# u3.age = 100# u3.save()# 2.修改博客信息# b3 = BlogModel.objects.get(id=9)# b3.address = "修改后的CSDN地址"b3 = BlogModel.objects.filter(id=9).update(address="再修改(update)后的CSDN地址")# b3.save()

删:

    # 1.删除blog表中的记录,直接删除# blog = BlogModel.objects.get(pk=10)# blog.delete()# 2.删除user表中数据,此user对应的blog也会删除u4 = UserModel.objects.get(pk=2)u4.delete()

3.多对一的正向查询

	# 多查询一的情况下,直接通过模型类中的外键关联字段查询# 正向查询b5 = BlogModel.objects.get(user_id=1)print(b5)print(b5.user.name)print(b5.user.age)print(b5.user.height)
>>>ORM关联模型
>>>张安
>>>100
>>>1.96  

4.多对一的反向查询

    # 反向查询:主表通过blogmodel_set查从表u6 = UserModel.objects.get(id=1)print(u6)b6 = u6.blogmodel_set.all()print(b6)for blog in b6:print(blog.title)print(blog.content)

二、一对一关系

1.一对一关系是什么

模型类使用OneToOneField用来定义一对一关系;

学生表与学生信息表 - - - 一对一
models.CASCADE:多表关联, 删除数据的时候 一删就全删

#app/model.py
class StudentModel(models.Model):name = models.CharField(max_length=50)age = models.IntegerField()height = models.DecimalField(max_digits=3, decimal_places=2)def __str__(self):return self.nameclass Meta:db_table = 'students'class StuDetail(models.Model):address = models.CharField(max_length=50)idcard = models.CharField(max_length=50)outlook = models.CharField(max_length=50)student = models.OneToOneField(to=StudentModel, on_delete=models.CASCADE)def __str__(self):return self.idcardclass Meta:db_table = 'detail'

其中,ON DELETEON UPDATE 表示事件触发限制,各参数意义如下:

参数意义
RESTRICT限制外表中的外键改动(默认值,也是最安全的设置)
CASCADE跟随外键改动
SET NULL设为null值
NO ACTION无动作
SET DEFAULT设为默认值

2.一对一关系的增删改操作

增:

    # 1.增加学生 Studentst1 = StudentModel()st1.name = "张三三"st1.age = 18st1.height = 1.79st1.save()# 2.增加学生信息 StuDetailsd1 = StuDetail()sd1.address = "北京"sd1.idcard = 123sd1.outlook = '团员'sd1.student = st1sd1.save()

改:

    # 3.修改 学生详细信息sd2 = StuDetail.objects.get(id=1)sd2.address = "我在中东吃炸鸡"sd2.save()# 4.修改 学生信息st2 = StudentModel.objects.get(id=1)st2.age = 12st2.save()

删:

    # 5.删除st5 = StudentModel.objects.get(id=1)st5.delete()

3.一对一关系正向查询

    # 5.正向查询:sd3 = StuDetail.objects.get(id=1)print(sd3.address)print(sd3.idcard)print(sd3.outlook)print(sd3.student.name)print(sd3.student.age)

4.一对一关系反向查询

	# 6.反向查询:st4 = StudentModel.objects.get(id=1)print(st4.name)print(st4.age)print(st4.studetail.address)print(st4.studetail.idcard)print(st4.studetail.outlook)

三、多对多关系

1.多对多关系是什么

多对多关系在模型中使用ManyToManyField字段定义

多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定on_delete属性
原因:在多对多的情况,有专门的第三张表,存储 对应关系, 表本身并没有字段来存储对应关系,此时删除任意数据,不影响另一张表数据

电影表与演员表 - - - 多对多

# app/models.py
class ActorModel(models.Model):name = models.CharField(max_length=50)age = models.IntegerField()gender = models.CharField(max_length=2)def __str__(self):return self.nameclass Meta:db_table = 'actors'class MovieModel(models.Model):name = models.CharField(max_length=50)mtime = models.CharField(max_length=50)info = models.CharField(max_length=50)actors = models.ManyToManyField(to=ActorModel)def __str__(self):return self.nameclass Meta:db_table = 'movies'

2.多对多关系的外键添加操作

创建:

    # 1.添加演员a1 = ActorModel()a1.name = '刘海柱'a1.age = 32a1.gender = '男'a1.save()#a2 = ActorModel()a2.name = '赵小刀'a2.age = 30a2.gender = '女'a2.save()#a3 = ActorModel()a3.name = '哈士奇'a3.age = 33a3.gender = '男'a3.save()-------------------------------------------# 2.添加电影信息m1 = MovieModel()m1.name = "精武门"m1.mtime = "2h"m1.info = "这是一个武打片"m1.save()m2 = MovieModel()m2.name = "ye邪不压正"m2.mtime = "2h30min"m2.info = "这肯呢个肯呢个可能是一个武打片"m2.save()m3 = MovieModel()m3.name = "don东北黑道纷纭"m3.mtime = "2h50min"m3.info = "黄及哦啊哦写"m3.save()

增加:

	# 3.给电影添加演员--正向的a1 = ActorModel.objects.get(id=1)a2 = ActorModel.objects.get(id=2)a3 = ActorModel.objects.get(id=3)# 给任意一个电影添加对应的演员m1 = MovieModel.objects.get(id=1)m1.actors.add(a1)m1.actors.add(a2)m1.actors.add(a3)
---------------------------------------------# 4.给演员安排几个电影拍m2 = MovieModel.objects.get(id=2)m3 = MovieModel.objects.get(id=3)a1 = ActorModel.objects.get(id=1)a1.moviemodel_set.add(m2,m3)

3.多对多关系的外键移除工作

多对多关联字段的删除,要使用remove来进行关系的断开
而不是直接使用deleteremove只会断开数据之间的联系,但是不会将数据删除

    # 5.删除,会删除电影及电影-演员表中的对应关系# MovieModel.objects.get(id=1).delete()# 6.删除对应关系:从某电影m6中移除某演员a1,只影响演员-电影对应关系表m6 = MovieModel.objects.get(id=6)a1 = ActorModel.objects.get(id=1)a1.moviemodel_set.remove(m6)

4.多对多关系的修改和查询

    # 7.查询数据# 根据任意一个电影,查询所有参演的演员-m1 = MovieModel.objects.get(id=1)print("-"*10)print(m1.actors.all())# 根据任意一个演员,查询拍过的所有电影 f反向查询a1 = ActorModel.objects.get(id=1)print("-"*10)print(a1.moviemodel_set.all())

在这里插入图片描述

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

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

相关文章

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下,智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构,介绍其核心要素和应用实践,帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…

如何进入 -MGMTDB目录

想想这个问题,大家可能觉得很简单吧,先不看答案,你试一试如何进去 1.问题现象: 我直接进入: cd -MGMTDB 直接就报错了: [gridhost03 _mgmtdb]$ cd -MGMTDB -bash: cd: -M: invalid option cd: usage: c…

Mujoco仿真【xml文件的学习 4】

在学习Mujoco仿真的过程中,mujoco的版本要选择合适。先前我将mujoco的版本升级到了mujoco-3.1.4,在运行act的仿真代码时遇到了问题,撰写了博客: Aloha机械臂的mujoco仿真问题记录-CSDN博客 下面在进行mujoco仿真时,统…

十_信号3-可重入函数

如上图所示链表,在插入节点的时候捕获到了信号,并且该信号的自定义处理方式中也调用了插入节点的函数。 在main函数中,使用insert向链表中插入一个节点node1,在执行insert的时,刚让头节点指向node1以后(如上图序号1)&…

linux系统下,mysql增加用户

首先,在linux进入mysql mysql -u root -p 然后查看当前用户: select user,host from user; 增加用户语句: CREATE USER 用户名host范围 IDENTIFIED BY 密码;

【C++】C++入门1.0

鼠鼠最近在学C,那么好,俺来做笔记了! 目录 1.C关键字(C98) 2.命名空间 2.1.命名空间定义 2.2.命名空间的使用 3.C的输入&&输出 4.缺省参数 4.1缺省参数概念 4.2.缺省参数的分类 5.函数重载 5.1.函数重载概念 5.2.C支持函数…

深度学习-04-数值的微分

深度学习-04-数值的微分 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动,也…

所有人都可以做的副业兼职,短剧推广,1天挣几百,附详细方法!

自从上次向大家介绍了短剧掘金项目以来,便陆续收到了众多朋友的询问:现在是否还能加入短剧掘金的大军?答案是肯定的。目前,无论是各大视频平台还是其他渠道,短剧掘金项目都呈现出蓬勃发展的态势。而且,相关…

SSM高校社团管理系统-计算机毕业设计源码86128

目 录 摘要 1 绪论 1.1研究背景与意义 1.2开发现状 1.3研究方法 1.4 ssm框架介绍 1.5论文结构与章节安排 2 高校社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分…

QT实现动态翻译切换

1、实现QT动态中英文切换效果 效果如下: 2、原理 因为软件本身就是中文版,所以只需准备一个英文版的翻译即可,,那就是将所有需要翻译的地方用tr包裹,然后首先执行lupdate更新一下,接着用qt的翻译软件 Qt Linguist打开ts文件进行翻译,然后保存,最后使用 lrelease发布一…

位运算专题

常见位运算总结: 1. 基础位运算 << 左移 >> 右移 ~ 按位取反 & 按位与 口诀: 有0则0 | 按位或 口诀: 有1则1 ^ 异或 口诀:相同为0,相异为1 / 无进位相加 2. 位运算的优先级 做题时, 能加括号就加括号, 无需管优先级如何 3. 给一个二进制数n, 确定…

为什么总是卡在验证真人这里无法通过验证?

最近总是在浏览某些网站的时候卡在这个“确认你是真人”的验证页面&#xff0c;无法通过真人验证&#xff0c;这是怎么回事儿&#xff1f;如何解决呢&#xff1f; 首先&#xff0c;出现这个“确认您是真人”的验证一般都是这个网站使用了 CloudFlare 的安全防护 WAF 规则才会出…

Ray Tracing in one Weekend But on CUDA

Ray Tracing in one Weekend But on CUDA 环境说明项目代码项目内容思路实现方法效果 环境说明 代码运行在Visual Studio 2019环境&#xff0c;显卡为NVIDIA GeForce GTX 1650&#xff0c;CUDA版本为11.6&#xff0c;cuDNN版本为8.4.0。具体配置方式见CUDA C/C 从入门到入土 第…

洛谷P2370yyy2015c01 的 U 盘

传送门——P2370 yyy2015c01 的 U 盘 题解&#xff1a;题目意思很好理解&#xff0c;就是说&#xff0c;当能够达到预期的U盘的最小接口&#xff08;接口越大&#xff0c;能传递的文件越大&#xff09;&#xff0c;然后我们就需要先看题目了&#xff0c;有n个文件&#xff0c;每…

【数据结构(邓俊辉)学习笔记】图02——搜索

文章目录 0. 概述1. 广度优先搜索1.1 策略1.2 实现1.3 可能情况1.4 实例1.5 多联通1.6 复杂度1.7 最短路径 2. 深度优先搜索2.1 算法2.2 框架2.3 细节2.4 无向边2.5 有向边2.6 多可达域2.7 嵌套引理 3 遍历算法的应用 0. 概述 此前已经介绍过图的基本概念以及它在计算机中的表…

vector实现后半部分

一.迭代器失效 1.定义 指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处 erase的迭代器失效 2.原因&#xff1a; 1.有的编译器实现erase会缩容拷贝 2.删除最后一个后&#xff0c;其指向无效元素 VS中不允许再次使用erase完的迭代器&#xff0c;为了让编写的代码移植…

Spring系列-SpringMvc父子容器启动原理解析

1、Spring整合SpringMVC 特性&#xff1a; 说到Spring整合SpringMVC唯一的体现就是父子容器&#xff1a; 通常我们会设置父容器&#xff08;Spring&#xff09;管理Service、Dao层的Bean, 子容器(SpringMVC)管理Controller的Bean .子容器可以访问父容器的Bean, 父容器无法访…

LLM——深入探索 ChatGPT在代码解释方面的应用研究

1.概述 OpenAI在自然语言处理&#xff08;NLP&#xff09;的征途上取得了令人瞩目的进展&#xff0c;这一切得益于大型语言模型&#xff08;LLM&#xff09;的诞生与成长。这些先进的模型不仅是技术创新的典范&#xff0c;更是驱动着如GitHub Copilot编程助手和Bing搜索引擎等广…

搭建大型分布式服务(三十九)SpringBoot 整合多个kafka数据源-支持Aware模式

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

计算一个3x3矩阵对角线和其它两条线的元素之和

计算一个3x3矩阵对角线和其它两条线的元素之和 #include <stdio.h> int main () { int d0,b0,s,i,j; int a[3][3]{1,2,3,4,5,6,7,8,9}; for(i0,j2;i<3;i,j--) dda[i][i]a[i][j]; for(i0,j0;i<3;) {bba[i][j]a[i][j2]; ii2;} sdb; printf("d%d\nb%d\ns%d\n&qu…