Python(Web时代)—— Django数据库(多表)

两表联查

常见的两表关系:

一对多:ForeignKey 

  • 举例:一个学生对应多个地址

  • 一般通过外键实现

  • 需要在“多”的那个模型中使用ForeignKey

  • 使用on_delete指定级联删除策略:

    • CASCADE:当父表数据删除时,相对应的从表数据会被自动删除

    • SET_NULL:当父表数据删除时,相对应的从表数据会被自动设置为null值

    • PROTECT:当父表数据删除时,如果有相对应的从表数据会抛出异常

    • SET_DEFAULT: 当父表数据删除时,相对应的从表数据会被自动设置为默认值,还需要额外指定default=True

一对一:OneToOneField

  • 举例:一个人对应一个身份证号

  • 数据字段设置 unique

  • 可以在任何一个模型类使用OneToOneField

多对多:ManyToManyField

  • 举例:一个学生有多个老师,一个老师有多个学生

  • 一般通过第三个表来实现关联

  • 可以在任何一个模型类使用ManyToManyField

一对多/多对一

创建学生与地址表(学生是一,地址是多)

class Student(models.Model):# 模型类中不需要指定 id字段,会自动生成# 数据库的可变字符串类型   varchar(20)name = models.CharField(max_length=20)age = models.IntegerField()create_time = models.DateTimeField('创建时间')class Address(models.Model):# CASCADE:当父表数据删除时,相对应的从表数据会被自动删除student = models.ForeignKey(Student, on_delete=models.CASCADE)detail = models.CharField(max_length=200)

需求:增加一个叫王老五的学生,给王老五添加一个地址

# 一对多,多对一 新增
def foreignkey_add(request):# 增加学生,和单表一样,采用 create方法直接生成数据,不需要再去调用savestudent = Student.objects.create(name='王老五', age=10,create_time=timezone.now())# 增加地址,通过外键_id形式给外键赋值 idAddress.objects.create(detail="河北省", student_id=student.id)return HttpResponse("一对多,新增成功!!!")

需求:删除id=2的学生,同时删除该学生对应的地址

# 一对多,多对一 删除
def foreignkey_del(request):# 删除学生(因创建表的时候,两表定义的关系为:on_delete=models.CASCADE ,所以删除学生,其对应的地址也会被删除)Student.objects.filter(id=2).delete()return HttpResponse("一对多,删除成功!!!")

需求:修改id=4的学生,修改id=3的地址

# 一对多,多对一 修改
def foreignkey_update(request):# 修改学生Student.objects.filter(id=4).update(name="小明")# 修改地址(修改需要用 filter 获取地址的查询集,使用 get 报错)Address.objects.filter(id=3).update(detail='武汉市')return HttpResponse("一对多,修改成功!!!")

正向查询: 先查询学生,再通过学生查询出其地址

反向查询: 先查询地址,再通过地址查询出学生

# 一对多,多对一 查询
def foreignkey_query(request):# 正向查询:通过学生,查询学生对应的地址信息# 查询id为2 的学生 以及他对应的地址信息# 1. 查询学生对象student = Student.objects.get(id=2)# 2.  # 通过django内置的属性  模型类_set, 可以查询出学生下的所有地址addressSet = student.address_set.all()res='正向查询:该学生所有的地址是:<br />'# 遍历所有对象for q in addressSet:res += str(q.id) + "." + q.detail + " <br />"res = '反向查询:地址对应的学生是:<br />'# 反向查询:通过地址,查询对应学生# 查询id为3的地址,以及对应的学生# 1. 查询地址对象address = Address.objects.get(id=3)# 2. 获取对应的学生信息 (对象.外键.关联模型类的字段)studentName = address.student.nameres +=studentName+ " <br />"return HttpResponse(res)

一对一

创建学生与身份证信息表(学生是一,身份证是一)

class Student(models.Model):# 模型类中不需要指定 id字段,会自动生成# 数据库的可变字符串类型   varchar(20)name = models.CharField(max_length=20)age = models.IntegerField()create_time = models.DateTimeField('创建时间')class Idcard(models.Model):remark = models.CharField(max_length=200,verbose_name="备注")num=models.CharField(max_length=20,verbose_name="身份证号")# CASCADE:当父表数据删除时,相对应的从表数据会被自动删除student = models.OneToOneField(to=Student, on_delete=models.CASCADE)

注:学生表之前就有,本次只需要新增 Idcard 表即可,添加完模型后,再次执行迁移命令:​​​​​​​

# 重新生成迁移文件
python manage.py makemigrations score# 同步数据库
python manage.py migrate

图片

# 一对一 新增
def oneToone_add(request):# 增加学生student = Student.objects.create(name='小王', age=14,create_time=timezone.now())# 增加身份信息Idcard.objects.create(num="123456789",remark="这是身份证", student_id=student.id)return HttpResponse("一对一,新增成功!!!")

# 一对一 删除
def oneToone_del(request):# 删除学生(其对应的身份信息也会被删除)Student.objects.filter(id=5).delete()# 删除身份信息(学生不会被删除)# Idcard.objects.filter(id=1).delete()return HttpResponse("一对一,删除成功!!!")

# 一对一 修改
def oneToone_update(request):# 修改学生Student.objects.filter(id=2).update(name="小王王")# 修改身份Idcard.objects.filter(id=2).update(remark='这是护照')return HttpResponse("一对一,修改成功!!!")

# 一对一 查询
def oneToone_query(request):# 正向查询:通过学生,查询学生对应的身份信息student = Student.objects.get(id=6)idcard_num = student.idcard.numres='正向查询:该学生所有的身份id是:<br />'+idcard_num+"<br />"# 反向查询:通过身份,查询对应学生idcard = Idcard.objects.get(id=2)student_name = idcard.student.nameres +='反向查询:身份对应的学生是:<br />'+student_name+ " <br />"return HttpResponse(res)

多对多

创建学生与老师表(一个学生对应多个老师,一个老师对应多个学生)

class Student(models.Model):# 模型类中不需要指定 id字段,会自动生成# 数据库的可变字符串类型   varchar(20)name = models.CharField(max_length=20)age = models.IntegerField()create_time = models.DateTimeField('创建时间')class Teacher(models.Model):name = models.CharField(max_length=20)gender = models.IntegerField(choices=((0,"男"),(1,"女")),verbose_name='性别')# 多对多没有 on_delete参数# 在多对多的情况,有专门的第三张表,存储 对应关系,表本身并没有字段来存储对应关系,此时删除任意数据,不影响另一张表数据student = models.ManyToManyField(to=Student)

执行完迁移命令后,出现以下表:

# 多对多 新增
def manyTomany_add(request):# 增加老师teacher = Teacher.objects.create(name='王老师', gender=1)# 增加学生student = Student.objects.create(name='小三', age=20,create_time=timezone.now())# 给老师添加多个学生# 对象.关联字段.add(关联的student表的id)teacher.student.add(2,3)return HttpResponse("多对多,新增成功!!!")

# 多对多 删除
def manyTomany_del(request):# 多对多关联字段的删除,要使用 remove 来进行关系的断开,而不是直接使用 delete# remove 只会断开数据之间的联系,但是不会将数据删除teacher = Teacher.objects.get(id=1)student = Student.objects.get(id=2)# 老师对象.关联字段.remove(学生对象)teacher.student.remove(student)return HttpResponse("多对多,删除成功!!!")

先解除原有关联,再重新添加新的关系

# 多对多 查询
def manyTomany_query(request):# 正向查询:通过学生,查询学生对应的老师student = Student.objects.get(id=3)teacher_list = student.teacher_set.all()res = '正向查询:该学生的老师是:<br />'# 遍历所有对象for q in teacher_list:res += str(q.id) + "." + q.name + " <br />"# 反向查询:通过老师,查询对应学生teacher = Teacher.objects.get(id=1)student_list = teacher.student.all()res += '反向查询:老师对应的所有学生是:<br />'# 遍历所有对象for q in student_list:res += str(q.id) + "." + q.name + " <br />"return HttpResponse(res)

注:以上所有添加的方法,都要在 score/urls.py中添加上,否则页面无法访问

图片

程序猿与投资生活实录已改名为  程序猿知秋,WX 公众号同款,欢迎关注!! 

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

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

相关文章

前端工程化

一、前端发展阶段概述 1、混沌期 整个江湖中只有一个传奇&#xff0c;就是”程序员” 这种模式下对人员的综合要求高&#xff0c;开发者既要会数据库开发&#xff08;SQL&#xff09;、又要会服务器端开发&#xff08;Java、C#、Php&#xff09;&#xff0c;还要会基本的前端…

使用 Netty 实现群聊功能的步骤和注意事项

文章目录 前言声明功能说明实现步骤WebSocket 服务启动Channel 初始化HTTP 请求处理HTTP 页面内容WebSocket 请求处理 效果展示总结 前言 通过之前的文章介绍&#xff0c;我们可以深刻认识到Netty在网络编程领域的卓越表现和强大实力。这篇文章将介绍如何利用 Netty 框架开发一…

<C++> STL_list

1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素和后一个元素。list与…

ELK日志收集系统

目录 一、概述 二、组件 一、logstash 一、工作过程 二、INPUT 三、FILETER 四、OUTPUTS 二、elasticsearch 三、kibana 三、架构类型 一、ELK 二、ELKK 三、ELFK 四、ELFKK 五、EFK 四、配置ELK日志收集系统集群实验的步骤文档 五、配置ELK日志收集系统集群 …

【JAVA基础】数据类型,逻辑控制

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 数据类型整型变量 int长整型变量 long单精度浮点数 float双精度浮点数 double字符类型 char字节…

C#_特性反射详解

特性是什么&#xff1f; 为程序元素额外添加声明信息的一种方式。 字面理解&#xff1a;相当于把额外信息写在干胶标签上&#xff0c;然后将其贴在程序集上。 反射是什么&#xff1f; 反射是一种能力&#xff0c;运行时获取程序集中的元数据。 字面理解&#xff1a;程序运行…

oracle 启停操作

1. 监听端口启停 # 根据实际情况 切换至oracle用户 su - oracle# 状态查看 lsnrctl stat# 启动1521端口监听 lsnrctl start# 关闭1521监听 lsnrctl stop 2. 数据库服务启停 # 立即关闭服务 shutdown immediate# 启动服务 startup

QT登陆注册界面练习

一、界面展示 二、主要功能界面代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QMainWindow(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setFixedSize(540,410); //设置固定尺寸th…

linux下安装Mycat

1 官网下载mycat 官方网站&#xff1a; 上海云业网络科技有限公司http://www.mycat.org.cn/ github地址&#xff1a; MyCATApache GitHubMyCATApache has 34 repositories available. Follow their code on GitHub.https://github.com/MyCATApache 2 Mycat安装 1 把MyCat…

【Java】基础入门 (十六)--- 异常

1.异常 1.1 异常概述 异常是指程序在运行过程中出现的非正常的情况&#xff0c;如用户输入错误、除数为零、文件不存在、数组下标越界等。由于异常情况再程序运行过程中是难以避免的&#xff0c;一个良好的应用程序除了满足基本功能要求外&#xff0c;还应具备预见并处理可能发…

Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写&#xff0c;旨在为 WEB 应用提供可扩展的高…

LeetCode-160. 相交链表

这是一道真的非常巧妙的题&#xff0c;题解思路如下&#xff1a; 如果让他们尾端队齐&#xff0c;那么从后面遍历就会很快找到第一个相交的点。但是逆序很麻烦。 于是有一个巧妙的思路诞生了&#xff0c;如果让短的先走完自己的再走长的&#xff0c;长的走完走短的&#xff0c;…

lib61850 学习笔记一 (概念)

IEC61850 定义60多种服务满足变电站通信需求。支持在线获取数据模型&#xff0c;也支持IED水平通信&#xff08;GOOSE报文&#xff09; 术语定义 间隔 bay: 变电站由据应公共功能紧密连接的子部分组成。 例如 介于进线或者 出线 和母线之间的断路器&#xff1b;二条母线之间…

mq与mqtt的关系

文章目录 mqtt 与 mq的区别mqtt 与 mq的详细区别传统消息队列RocketMQ和微消息队列MQTT对比&#xff1a;MQ与RPC的区别 mqtt 与 mq的区别 mqtt&#xff1a;一种通信协议&#xff0c;规范 MQ&#xff1a;一种通信通道&#xff08;方式&#xff09;&#xff0c;也叫消息队列 MQ…

深入解析SNMP协议及其在网络设备管理中的应用

SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;作为一种用于网络设备管理的协议&#xff0c;在实现网络设备的监控、配置和故障排除方面发挥着重要的作用。本文将深入解析SNMP协议的工作原理、重要概念和功能&#xff0c;并探讨…

uniapp实现:点击拨打电话,弹出电话号码列表,可以选择其中一个进行拨打

一、实现效果&#xff1a; 二、代码实现&#xff1a; 在uni-app中&#xff0c;使用uni.showActionSheet方法实现点击拨打电话的功能&#xff0c;并弹出相关的电话列表供用户选择。 当用户选择了其中一个电话后&#xff0c;会触发success回调函数&#xff0c;并通过res.tapInde…

OpenGL精简案例一

文章目录 案例一 绘制点线面定义Renderer顶点着色器片段着色器内置的特殊变量 应用场景工具ShaderHelper工具 TextResourceReader效果图如下 结论 案例一 绘制点线面 定义Renderer import android.content.Context; import android.opengl.GLES20; import android.opengl.GLSu…

Vue3.0 新特性以及使用变更总结

Vue3.0 在2020年9月正式发布了&#xff0c;也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发&#xff0c;这篇文章就是在使用后的一个总结&#xff0c; 包含Vue3新特性的使用以及一些用法上的变更。 图片.png 为什么要升级Vue3 使用Vue2.x的小伙伴都熟悉…

Vue中如何为Echarts统计图设置数据

在前端界面接收后端数据后&#xff0c;将数据赋值给ECharts中的data时出现了&#xff0c;数据读取失败的问题&#xff08;可能是由于数据渲染的前后顺序问题&#xff09;。后通过如下方式进行了解决&#xff1a; 1、接下来将介绍UserController中的countUsers方法&#xff0c;…

vue实现富文本

效果图展示 一、安装依赖 npm install vue-quill-editor --save二、具体使用 html <template><!-- 富文本 --><quill-editorref"myQuillEditor"v-model"content":options"editorOption"blur"onEditorBlur($event)"…