django ORM框架 第三章 关联表的数据创建与查询

news2024/11/23 1:20:36

一、背景:

创建一组一对多的表。


# 班级表
class Class(models.Model):
    class_id = models.IntegerField(primary_key=True, verbose_name='班级id', help_text='班级id')
    class_name = models.CharField(max_length=20,verbose_name='班级名称', help_text='班级名称')



# 学生信息表
class Student(models.Model):
    id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
    name = models.CharField(max_length=20,verbose_name='姓名', help_text='姓名')
    student_id = models.CharField(max_length=10,verbose_name='学号', help_text='学号',unique=True)

    # 创建外键,外键需要创建多的那一个表中(从表)
    # models.ForeignKey('应用名.主表的类名') 与哪个表建立外键
    # on_delete= 外键的级联删除:如果父表中的记录被删除,则子表中对应的记录如何处理
    # on_delete=models.CASCADE(),如果父表中的记录被删除,则子表中对应的记录自动被删除
    class_name = models.ForeignKey('orders.Class',on_delete=models.CASCADE,verbose_name='班级', help_text='班级')

主表:班级表

从表:学生信息表

注意:

从表,在创建外键的时候

class_name = models.ForeignKey('orders.Class',on_delete=models.CASCADE,verbose_name='班级', help_text='班级')

模型类中,外键的类属性名称为 class_name。但是生成的表中,外键的字段名称为class_name_id。

ORM框架,在生成从表的外键字段名称时,自动在后面追加了一个_id。

二、关联表的数据创建

如何在从表中,插入数据?对于外键数据的处理,有两种方式。

2.1 外键的类的属性名=主表的数据实例

举例:

在Student表中,插入一条学生姓名为 阿珍,所属班级class_id=3 的学生信息。

1、先获取主表的数据实例

2、再通过外键 类的属性名 = 主表的数据实例 创建

def add_student_1(request):
    """
    添加一名学生信息。姓名:阿珍。所属班级class_id:3
    :param request:
    :return:
    """
    # 先获取主表的数据实例(班级id为3)
    class_obj = Class.objects.get(class_id="3")

    # 从表数据,外键绑定主表实例
    Student.objects.create(name="阿珍",student_id="0019",class_name=class_obj)

    return HttpResponse("成功")

2.2 从表中的外键字段名=具体的值

举例:

在Student表中,插入一条学生姓名为 大红帽,所属班级class_id=3 的学生信息。

Student.objects.create(name="大红帽",student_id="0021",class_name_id=4)

三、关联表的查询

3.1 在从表中,查询主表的相关信息(非关联查询)

通过外键获取

查询 学生姓名 【张红】 所在的【班级】 信息

1、先获取从表的数据实例

2、再通过 从表的数据实例.外键的类属性名称 获取 主表的数据实例

    class_ojb=Student.objects.filter(name="张红").first().class_name
    print(class_ojb.class_id)
    print(class_ojb.class_name)

 3.2 在主表中获取从表数据(非关联查询)

通过从表模型类名小写_set_all() 获取

查询班级名称为【二班】的所有学生数据

1、先获取主表的数据实例

2、再通过  从表模型类名小写_set.all()进行关联

或者 表模型类名小写_set.filter(过滤条件)

students_info=Class.objects.filter(class_name="二班")[0].student_set.all()

获取到的值    students_info 是 QuerySet 

<QuerySet [<Student: Student object (4)>, <Student: Student object (5)>]>


注意:

从表模型类名小写_set 返回的对象为 manager对象。

3.2.1  related_name

主表的实例 通过从表模型类名小写_set_all() 获取 从表的数据,

这里 【从表模型类名小写_set】 ,我们在创建从表模型类的外键时可以自定义名称,通过

related_name= 实现

创建外键:

class_name = models.ForeignKey('orders.Class',on_delete=models.CASCADE,verbose_name='班级', help_text='班级',related_name="inter")

 查询语句:

students_info=Class.objects.filter(class_name="二班")[0].inter_set.all()

 

3.3 关联查询(这个方式应该是最简单的)

关联查询,不区分主表、从表。查询方式是一样的。

查询班级名称为 三班 的所有学生信息

格式:

表1模型类.objects.filter(外键类属性的名称__表2中字段名=value)

x=Student.objects.filter(class_name__class_name="三班")

注意:

外键类属性的名称__主表中字段名 中间,是两个下划线。

四、逻辑关系

 

4.1 与

方式一:在同一个filter方法内部,添加多个关键字参数,每个条件为“与”的关系

举例:

查询class_name =2,并且name 中包含 “五”的学生信息。

Student.objects.filter(name__contains="五",class_name=2)

方式二:多次调用fillter方法,QuerySet 链式调用特性

Student.objects.filter(name__contains="五").filter(class_name=2)

4.2 或

可以使用Q查询,实现逻辑关系 【或】,多个Q对象之间 用“|” 实现【或】关系

查询class_name =2,或者name 中包含 “红”的学生信息。

需要提前引入 

from django.db.models import Q
Student.objects.filter(Q(name__contains="红") | Q(class_name=2))

4.3 查询排序

排序对象:

只针对QuserSet 查询集或者mannager对象

1、默认ASC升序

QuerySet对象.order_by(“字段名”)

举例,查询name中包含“红”的学生信息,按照 student_id 升序排序

Student.objects.filter(name__contains="红").order_by("student_id")

2、降序排序DESC

在字段名称前加“-”,则为降序

Student.objects.filter(name__contains="红").order_by("-student_id")

上一章:

django ORM框架 第二章 表与表的关系&关联表_做测试的喵酱的博客-CSDN博客

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

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

相关文章

Centos虚拟机与window共享文件夹

1.安装完centos系统后&#xff0c;查看是否安装好VMware tools 如果未安装&#xff0c;请参考此文章安装&#xff1a; CentOS安装VMwareTools_centos安装vmware tools_Sunqk5665的博客-CSDN博客 2.添加共享文件夹 3.使用vmware-hgfsclient查看共享文件夹。本例中为share 4. 挂…

5.1 标准IO介绍及缓冲区

目录 标准I/O介绍 文件的概念和类型 标准I/O-流&#xff08;可理解为数据&#xff09; 流的缓冲类型 标准I/O——stdin,stdout,stderr 标准I/O介绍 在寄存器中的输入输出标准&#xff0c;在任何系统上可运行&#xff0c;是一系列的接口&#xff0c;所以被称为标准IO lin…

学会ECharts 数据缩放组件

本文首发自「慕课网」&#xff08;imooc.com&#xff09;&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;范文杰_fe|慕课网讲师 在一个数据图表中&#xff0c;可能由于数据所表…

Mtlab基础(十):极限的求解

在做研究的过程中,需要涉及到极限的求解,面对简单的极限大家都能够轻松解决,但是当面临复杂的问题时,传统的差分进化算法就难以解决了。 对于求解极限,Matlab提供了非常好的工具**limit**,具体的使用方法: limit(f,v,a)-------------------------------------------…

RFID在空调装配中的作用

RFID在空调装配中的作用 随着物联网和射频识别技术 (RFID) 的发展&#xff0c;越来越多的应用开始使用 RFID 技术来提高生产效率和产品质量。在空调装配过程中&#xff0c;RFID 技术可以发挥重要作用。 RFID 技术可以帮助空调制造商提高装配效率。使用 RFID 技术&#xff0c;…

CircuitBreaker Resilience4J 介绍

最近接触到了CircuitBreaker Resilience4J &#xff0c;网上查了查资料&#xff0c;这里整合记录一下&#xff0c;供大家学习和参考 目录 前言 1、熔断器出现背景 ​​​​​​​ 2、支持断路器实现有以下几种 3、Circuit Breaker原理 4、概念说明 限流 — RateLimiter …

CPU Architecture

CPU Architecture [/ˈɑːrkɪtektʃər/] 指令集架构 &#xff08;Instruction Set Architecture&#xff09;精简指令集处理器 RISC (Reduce Instruction Set Computer)复杂指令集处理器 CISC (Complex Instruction Set Computer) CPU按指令集架构分类ARM运行模式非特权模式…

什么是NTFS for Mac?2023新版本如何下载

在NTFS for Mac中包含了多种功能操作&#xff0c;促进软件更好地使用&#xff0c;可以进行全局设置&#xff0c;也可以针对某一各挂载的磁盘进行针对性设置。 本集小编主要向大家介绍它包含的一些基本功能&#xff0c;看看这款mac读写工具能够实现那些功能&#xff0c;全面了解…

安科瑞电能表对于预付费平台的费控策略应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略&#xff0c;介绍3个子策略的制定原则、设计流程&…

Flink学习——状态编程

目录 一、Flink中的状态 二、状态编程 (一)ValueState案例——判断传感器的数据 1.代码实现 2.端口进行传输数据 3.运行结果 (二)ListState (三)MapState案例——比较学生每次考试成绩 1.代码实现 2.端口传输学生成绩 3.运行结果 (四)ReducingState 一、Flink中的状…

0Ω的电阻作用

0欧姆电阻即电阻标值为0欧姆的电阻&#xff0c;多用于PCB设计等方面&#xff0c;是一种理想电阻。那0欧姆电阻是表示没有电阻吗&#xff1f;当然不是&#xff0c;0欧姆电阻的阻值不是0欧姆&#xff0c;只是接近0欧姆。 1、调试方便或者兼容设计&#xff1a;可以选择器件、功能…

网络安全--XXE漏洞利用思路

一、XXE 是什么 介绍 XXE 之前&#xff0c;我先来说一下普通的 XML 注入&#xff0c;这个的利用面比较狭窄&#xff0c;如果有的话应该也是逻辑漏洞 如图所示&#xff1a; 既然能插入 XML 代码&#xff0c;那我们肯定不能善罢甘休&#xff0c;我们需要更多&#xff0c;于是出…

Python环境安装,操作MySQL数据脚本

安装Python 下载地址Python Releases for macOS | Python.org下载安装包点击安装执行python3命令查看安装及版本 安装插件 安装PyMySQL python3 -m pip install PyMySQL 编写脚本 创建文件selectMysql.py #!/usr/bin/python import pymysql.cursors def updateuser(user_…

chatgpt赋能Python-python3_4

Python3-4: 编程领域的瑰宝 简介 Python3-4 是一种开源解释型高级编程语言&#xff0c;具有简单易学、可读性强、语法简洁的特点。它由谷歌公司所开发&#xff0c;在全球范围内被广泛应用于Web开发、人工智能、科学计算、数据分析等领域。 优势 1. 语法简洁 Python3-4采用…

今天面试招了个20K的人,从腾讯出来的果然都有两把刷子···

现在找个会自动化测试的人真是难呀&#xff0c;10个里面有8个写了会自动化&#xff0c;但一问就是三不知 公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的…

实施基于零信任网络安全的设备控制

零信任安全是一种数据保护策略&#xff0c;除非系统管理员进行彻底验证&#xff0c;否则网络边界内外的所有设备和实体都不受信任。Device Control Plus 可帮助管理员为其网络实施和自动化零信任安全协议&#xff0c;以确保对来自未经批准的外围设备的所有端点数据提供最佳保护…

嵌入式软件测试笔记1 | 简单说明 嵌入式系统认识和测试目标

1 | 简单说明 & 嵌入式系统认识和测试目标 1 为什么看这个&#xff1f;2 一些说明3 主要内容是什么&#xff1f;4 嵌入式系统测试的目标4.1 测试的任务4.2 最终目标4.3 测试过程4.4 通用元素 5 嵌入式系统的一些基础 1 为什么看这个&#xff1f; 一直在间断性的学习和了解…

chatgpt赋能Python-python3_6怎么调整字体大小

Python3.6 是一种广泛使用的编程语言&#xff0c;可以帮助人们创建各种各样的应用程序。不过&#xff0c;当我们在使用 Python3.6 编写程序时&#xff0c;有时会遇到一些困难&#xff0c;比如如何调整字体大小。那么&#xff0c;今天我们就来看看如何应对这个问题。 如何在 Py…

(十二)centos7案例实战——swap虚拟内存配置

前言 在实际生产环境中&#xff0c;我们的服务器由于内存配置资源有限&#xff0c;会遇到一些线上服务宕机或者内存溢出等问题&#xff0c;那么如何解决这些问题呢&#xff0c;一方面我们要确认问题的具体原因&#xff0c;通过排查自身应用服务的问题&#xff0c;一方面增加我…

Linux 之 supervisor安装和使用

Supervisor 官网 一、介绍 Supervisor有四个组件&#xff1a; 1. supervisord 运行Supervisor的后台服务&#xff0c;它用来启动和管理那些你需要Supervisor管理的子进程&#xff0c;响应客户端发来的请求&#xff0c;重启意外退出的子进程&#xff0c;将子进程的stdout和s…