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

news2025/1/21 13:07:08

两表联查

常见的两表关系:

一对多: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方法直接生成数据,不需要再去调用save
    student = Student.objects.create(name='王老五', age=10,create_time=timezone.now())
    # 增加地址,通过外键_id形式给外键赋值 id
    Address.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.name
    res +=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.num
    res='正向查询:该学生所有的身份id是:<br />'+idcard_num+"<br />"

    # 反向查询:通过身份,查询对应学生
    idcard = Idcard.objects.get(id=2)
    student_name = idcard.student.name
    res +='反向查询:身份对应的学生是:<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.coloradmin.cn/o/950856.html

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

相关文章

xml和json互转工具类

分享一个json与xml互转的工具类&#xff0c;非常好用 一、maven依赖 <!-->json 和 xm 互转</!--><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version></dependency&g…

网工内推 | 技术支持工程师,最高40k,CCNP、CISP认证优先

01 卓望公司 招聘岗位&#xff1a;高级技术支持工程师 职责描述&#xff1a; 1、负责网络安全防护类产品技术支持工作&#xff0c;包括但不限于&#xff1a;抗DDoS&#xff0c;云WAF&#xff0c;漏洞扫描等。 2、负责网络安全防护类产品安装、配置、升级和系统加固等维护支撑工…

软考知识汇总--操作系统

操作系统 1 操作系统层次结构图 2 进程管理 2.1 程序与进程 2.1.1 顺序执行 PV操作

【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

商城检索服务 1.检索页面的搭建 商品检索页面我们放在search服务中处理&#xff0c;首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 <!-- 添加Thymeleaf的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifa…

设计模式行为型-状态模式

文章目录 简介状态模式基础定义状态接口或抽象类实现具体状态类 上下文类与状态转换上下文类的定义和作用状态转换及触发条件 状态模式的优势与适用性优点一&#xff1a;可维护的代码优点二&#xff1a;清晰的状态管理适用场景一&#xff1a;对象拥有多个状态适用场景二&#x…

分享一个非常有趣的纯css杂志封面折叠效果

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;有趣的纯css杂志封面折叠效果 文章目录 效果出处效果HTMLCSS 效果出处 这个css杂志封面折叠效果非常有趣&#xff0c;我就转载加以记录。 效果来源于&#xff1a;码上掘金Mad Magazine 效果 HTML…

硬件系统工程师宝典(38)-----常用接口之视频接口的电路设计

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们介绍了一些常用的接口带EMC保护的电路设计&#xff0c;有AC24V、AC110~220V、AV接口、CAN接口、DC12V、DC24V、DC48V接口。今天我们来讲一…

vulhub之MinIO信息泄露漏洞(CVE-2023-28432)

文章目录 0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞复现1.启动环境2.查看端口3.构造POC 0x05 修复建议 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本文作者无关&#xff0c;需自行负责&#xff01;&#xff01;&#xff01; 0x02 漏洞描述 …

攻防世界-web-fakebook

1. 题目描述 打开链接&#xff0c;这样一个界面 貌似没啥特殊的。。。没关系&#xff0c;我们每个页面都点击一下 login页面&#xff1a;一个简单的登录页面 join界面&#xff1a;不出意外&#xff0c;这应该是一个注册界面 目前&#xff0c;我们什么都不做&#xff0c;能获…

文本匹配实战系列

引言 本系列文章开始介绍深度学习在文本匹配领域的应用&#xff0c;并且会尝试得到各种模型在给定的数据集上的表现。 深度文本匹配发展比较久&#xff0c;积累了很多文本匹配方法。也有很多的分类方式&#xff0c;一种分类方式是表示型和交互型。 表示型方法 表示型(repre…

上海亚商投顾:沪指缩量震荡 数据要素概念午后爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日延续反弹&#xff0c;深成指、创业板指盘中涨超1%&#xff0c;随后上演冲高回落走势。数据要素概念午后爆…

universal robot 机械臂 官方基本教程

https://academy.universal-robots.cn/modules/e-Series-core-track/Chinese/module3/story_html5.html?courseId2166&languageChinese 教程1 控制箱内部 包含&#xff1a; 主机板&#xff0c;SD卡&#xff0c;和安全控制板 安全控制板负责所有控制信息&#xff0c;包括…

Android需要掌握的shell脚本基础

linux中sh是链接到bash上的&#xff0c;所以sh与bash在功能上是没有区别的&#xff0c;相当于bash解析器是sh的增强版本&#xff0c;所以安卓开发者可以在 git bash中 测试脚本 1&#xff0c;shell脚本运行与输出指令 $ cat test.sh echo 测试 【输出】$ /bin/bash test.…

Spring框架知识点汇总

01.Spring框架的基本理解 关键字&#xff1a;核心思想IOC/AOP&#xff0c;作用&#xff08;解耦&#xff0c;简化&#xff09;&#xff0c;简单描述框架组成&#xff1b; Spring框架是一款轻量级的开发框架&#xff0c;核心思想是IOC&#xff08;反转控制&#xff09;和AOP&a…

【操作系统】聊聊局部性原理是如何提升性能的

对于目前数据主导的系统&#xff0c;大多数都是Java/Go 技术栈MySQL&#xff0c;但是随着时间的推移&#xff0c;数据库数据的数据量过多&#xff0c;并且会频繁访问热点数据&#xff0c;为了提升系统的性能&#xff0c;一般都是加入缓存中间件、Redis。 局部性原理 我们知道…

Pytorch学习:神经网络模块torch.nn.Module和torch.nn.Sequential

文章目录 1. torch.nn.Module1.1 add_module&#xff08;name&#xff0c;module&#xff09;1.2 apply(fn)1.3 cpu()1.4 cuda(deviceNone)1.5 train()1.6 eval()1.7 state_dict() 2. torch.nn.Sequential2.1 append 3. torch.nn.functional.conv2d 1. torch.nn.Module 官方文档…

python的可哈希对象

一、介绍 在Python中&#xff0c;可哈希&#xff08;hashable&#xff09;是指一种对象类型&#xff0c;该类型的对象可以用作字典的键&#xff08;keys&#xff09;或集合&#xff08;sets&#xff09;的元素。可哈希的对象具有以下特点&#xff1a; 不可变性&#xff08;Imm…

【Interaction交互模块】LinearTransformDrive线性变换驱动

文章目录 一、预设位置二、案例&#xff1a;建一个按下后可自动抬起的按钮三、留有疑问 一、预设位置 交互——可控制物体——变换——线性变换驱动 二、案例&#xff1a;建一个按下后可自动抬起的按钮 按钮的结构和设置如下图 为了让它碰触时&#xff0c;往下走——预设体…

【Go 基础篇】Go语言结构体基本使用

在Go语言中&#xff0c;结构体是一种重要的数据类型&#xff0c;用于定义和组织一组不同类型的数据字段。结构体允许开发者创建自定义的复合数据类型&#xff0c;类似于其他编程语言中的类。本文将深入探讨Go语言中结构体的定义、初始化、嵌套、方法以及与其他语言的对比&#…

Java八股文学习笔记day01

01.和equals区别 对于字符串变量来说&#xff0c;使用""和"equals"比较字符串时&#xff0c;其比较方法不同。""比较两个变量本身的值&#xff0c;即两个对象在内存中的首地址&#xff0c;"equals"比较字符串包含内容是否相同。 对于非…