【Django】Task3 外键的使用、Queryset和Instance

【Django】Task3 外键的使用、Queryset和Instance

Task3主要理解数据库外键的使用场景,了解Queryset的功能,通过编写代码体验Queryset中对数据库实例的curd操作,同时了解到Instance的定义。
在这里插入图片描述

1.外键的使用

1.1什么是外键

数据表外键是数据库设计中的一个重要概念,它用于建立两个数据表之间的关系。外键定义了一个字段,该字段与另一个表的主键字段相关联,从而在逻辑上将两个表连接起来。外键用于表示表之间的关系,通常用于实现一对多(多对一)和多对多关系。

以下是关于数据表外键的详细说明:

建立关系: 外键允许您在一个表中建立到另一个表的关系。这种关系通常表示一个表的记录与另一个表的记录之间的连接,如订单和客户、学生和课程等。参照完整性: 外键确保了数据的参照完整性。这意味着在建立外键关系后,数据库会强制执行数据的一致性,确保只有在相关表中存在的值才能插入到关联表中。这有助于防止不一致或无效的数据。一对多关系: 外键常用于建立一对多关系,其中一个表的一行对应于另一个表中的多行。在这种情况下,一个表的主键被用作另一个表的外键。多对一关系: 一对多关系的另一种称呼是多对一关系,其中多个行指向同一个表中的一个行。例如,在订单和客户之间的关系中,多个订单可能指向同一个客户。多对多关系: 在多对多关系中,使用中间表来处理外键关系。这个中间表通常存储了两个表的主键,以表示它们之间的关联。级联操作: 外键关系通常伴随着级联操作的概念。当您执行某些操作(如删除或更新)时,可以指定当一个表中的记录被更改时应该如何处理关联表中的相关记录。查询和连接: 外键允许您使用查询来连接相关表,从而获取与某个表中的记录相关联的信息。这是数据库关系型特性的一个重要优势。

总之,数据表外键是数据库设计的核心概念之一,用于建立表与表之间的关系,以实现数据的一致性、完整性和查询能力。外键是实现复杂关系的强大工具,使数据表之间的关联和查询变得更加有效和有序。

1.2外键的使用例子

当在数据库中使用外键(Foreign Key)时,您在一个表中创建一个字段,该字段与另一个表中的某个字段建立关联。这种关联通常用于表示表之间的一对多关系。例如,一个学生可以有多个课程,但一个课程只属于一个学生。让我通过一个简单的示例来说明外键的使用。

假设我们有两个表,一个是 Student 表,另一个是 Course 表。我们希望在 Course 表中添加一个外键,将课程与学生关联起来。

from django.db import modelsclass Student(models.Model):name = models.CharField(max_length=100)class Course(models.Model):name = models.CharField(max_length=200)student = models.ForeignKey(Student, on_delete=models.CASCADE)  # 添加外键

在这个示例中,我们在 Course 模型中添加了一个 student 外键字段,它关联到了 Student 模型。这意味着一个课程(Course)将与一个学生(Student)相关联。

  • on_delete=models.CASCADE:这是外键的删除行为。如果一个学生被删除,与其相关的课程也会被级联删除。其他可能的选项还有 SET_NULL(将外键字段设置为 NULL)、SET_DEFAULT(设置为默认值)等。
    在这个例子中,当您创建课程时,需要指定与之关联的学生。例如:
student = Student.objects.create(name="John Doe")
course = Course.objects.create(name="Math 101", student=student)

这样,course 就与 student 关联起来了。

通过使用外键,您可以在数据库中创建关系,并且 Django 会处理数据库层面的关联和查询。这有助于实现数据的一致性和结构化。

1.3多对多情况下的处理

在多对多的关系中,通常需要使用中间表(也称为联接表、关联表)来建立两个表之间的关系。这是因为直接使用外键关联在多对多关系下会变得复杂且不切实际。

举例来说,如果有两个实体,例如 Student 和 Course,并且一个学生可以选择多门课程,同时一门课程也可以有多名学生,这就是典型的多对多关系。在这种情况下,使用中间表来解决关系是更合适的做法。

中间表可以存储两个表之间的关联信息,它包含了两个外键,分别指向两个相关的实体。通过这种方式,可以轻松地管理多对多关系,而不需要在主实体中维护多个外键,这将会变得非常复杂和不便于维护。

示例代码如下:

from django.db import modelsclass Student(models.Model):name = models.CharField(max_length=100)courses = models.ManyToManyField('Course', through='Enrollment')class Course(models.Model):name = models.CharField(max_length=200)students = models.ManyToManyField('Student', through='Enrollment')class Enrollment(models.Model):student = models.ForeignKey(Student, on_delete=models.CASCADE)course = models.ForeignKey(Course, on_delete=models.CASCADE)enrollment_date = models.DateField()

在这个示例中,我们创建了一个名为 Enrollment 的中间表,用于存储学生和课程之间的关系。Student 和 Course 表都使用 ManyToManyField 来建立多对多关系,而 Enrollment 表则存储了学生和课程之间的具体关联信息,包括关联日期等。

总结起来,在多对多关系中,使用中间表是一种更有效的方法,可以避免复杂的外键关联。这种方式更易于管理和维护多对多关系。

1.4键类型拓展

外键是数据库中常用的概念,它用于建立表与表之间的关系,特别是一对多(或多对一)关系。除了外键,还有一些其他类型的键,例如主键和唯一键。以下是一些常见的键类型及其作用:

  • 主键(Primary Key): 主键是一种唯一标识表中每一行记录的键。每个表只能有一个主键,它用于确保每行数据的唯一性,并且可以用于快速查找特定行。主键在数据库中通常用于建立表的基本结构。

  • 外键(Foreign Key): 外键用于在两个表之间建立关系。它指向另一个表的主键,以表示两个表之间的关联。外键在数据库中用于实现一对多(或多对一)关系,其中一个表的值与另一个表中的主键值相对应。

  • 唯一键(Unique Key): 唯一键确保表中的某个字段的值是唯一的,但不一定是主键。与主键不同,唯一键可以允许 NULL 值,但如果存在非 NULL 值,则这些值必须在表中唯一。唯一键可用于确保某个字段的值不会重复。

  • 复合键(Composite Key): 复合键是由多个字段组合而成的键,用于唯一标识一行记录。它可以是表中的多个字段的组合,以确保记录的唯一性。复合键在某些数据库系统中使用,但在某些数据库中不被广泛支持。

  • 候选键(Candidate Key): 候选键是可以用作主键的字段集合,具有唯一性和最小性质。一个表可能有多个候选键,但只能选择其中一个作为主键。

这些键在数据库设计和优化中扮演着重要角色。根据您的应用程序的需求,您可能会使用不同类型的键来建立正确的数据结构和关系。主键和外键是最常用的键类型,用于创建表之间的连接和关联。

2.Queryse

在 Django 中,QuerySet 是一个表示数据库查询的懒加载数据集合。它允许您执行数据库查询以检索和操作数据库中的数据,并将查询结果作为对象集合返回。QuerySet 提供了一个高级的 API,使您能够轻松地构建和执行复杂的数据库查询操作,而无需编写 SQL 查询语句。

2.1QuerySet的特点和功能

QuerySet 具有以下特点和功能:

  • 惰性加载: QuerySet 的查询操作是惰性加载的,这意味着查询不会立即执行。只有在真正需要数据时(如迭代、切片、访问属性等)才会触发查询。

  • 链式操作: 您可以将多个查询操作链接在一起,构建一个查询链。这使得您能够逐步构建查询,添加过滤、排序、限制等操作。

  • 丰富的查询方法: QuerySet 提供了许多方法,用于执行各种数据库查询操作,如过滤、排序、聚合、连接等。

  • 数据访问: QuerySet 的查询结果可以通过迭代、索引或访问属性来访问数据,类似于一个对象集合。

  • 数据修改: QuerySet 也提供了方法用于对查询结果进行修改,如更新、删除等操作。

  • 惰性评估和缓存: QuerySet 可以缓存查询结果,以便在多次访问时避免重复查询。

2.2QuerySet的常用方法

以下是一些常见的 QuerySet 方法示例:

filter(**kwargs):过滤查询结果,只返回满足特定条件的对象。
exclude(**kwargs):排除满足特定条件的对象,返回不满足条件的对象。
order_by(*fields):按照指定的字段进行排序。
annotate(**kwargs):进行聚合操作,添加额外的注释字段。
values(*fields):返回指定字段的字典数据。
values_list(*fields):返回指定字段的元组数据。
get(**kwargs):获取单个满足条件的对象。
first():返回第一个对象。
last():返回最后一个对象。
count():返回查询结果的数量。
QuerySet 是 Django 数据库查询的核心部分,它使得数据库操作更加抽象化和高级化。通过使用 QuerySet,您可以有效地与数据库交互,并以更简洁的方式编写数据查询逻辑。

2.2QuerySet的方法示例

当涉及 Django 的 QuerySet 方法时,以下是一些常见方法的代码示例:

假设我们有一个名为 Book 的模型,其中包含图书的标题、作者和出版日期等信息。

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=200)author = models.CharField(max_length=100)publication_date = models.DateField()def __str__(self):return self.title

以下是一些常见的 QuerySet 方法示例:

# 查询所有图书
all_books = Book.objects.all()# 查询出版日期在特定年份之后的图书
recent_books = Book.objects.filter(publication_date__year__gt=2020)# 查询作者为特定值的图书
specific_author_books = Book.objects.filter(author="J.K. Rowling")# 排除作者为特定值的图书
other_authors_books = Book.objects.exclude(author="J.K. Rowling")# 按出版日期升序排序图书
sorted_books = Book.objects.order_by('publication_date')# 查询图书数量
book_count = Book.objects.count()# 获取第一本图书
first_book = Book.objects.first()# 获取最后一本图书
last_book = Book.objects.last()# 获取满足条件的单个图书
specific_book = Book.objects.get(title="Harry Potter")# 返回只包含标题的字典列表
book_titles = Book.objects.values('title')# 返回只包含标题和作者的元组列表
book_titles_and_authors = Book.objects.values_list('title', 'author')

这些是一些常见的 QuerySet 方法示例,您可以根据需要使用不同的方法来构建和执行数据库查询操作。请注意,这只是一小部分 QuerySet 方法,Django 还提供了许多其他方法,用于处理更复杂的查询需求。

3.Instance

在 Django 中,“Instance” 是指一个特定数据库模型的单个对象实例。换句话说,每当您从数据库中获取一条记录,您就会获得该模型的一个实例。

在 Django 的 ORM(对象关系映射)中,模型类对应于数据库表,而模型的实例则对应于数据库表中的一行数据。通过创建模型类的实例,您可以操作和访问数据库表中的数据。

以下是一个示例,展示了一个名为 Book 的模型类和一个该模型的实例:

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=200)author = models.CharField(max_length=100)publication_date = models.DateField()def __str__(self):return self.title# 创建一个 Book 实例
book_instance = Book.objects.create(title="Harry Potter and the Philosopher's Stone",author="J.K. Rowling",publication_date="1997-06-26"
)# 获取单个实例
single_book = Book.objects.get(title="Harry Potter and the Philosopher's Stone")

在这个示例中,book_instance 是一个 Book 模型的实例,它对应于数据库表中的一行数据。通过使用 Django 的查询集方法,您可以创建、获取、更新和删除模型实例,以及执行其他与数据库交互相关的操作。

Django 的 Instance 是指模型类的单个对象实例,它允许您以面向对象的方式操作数据库中的数据。

4.queryset和instance的主要区别,分别在什么业务场景下使用

QuerySet 和 Instance 都是 Django ORM 中的重要概念,用于操作数据库中的数据,但它们在用途和应用场景上有所不同。

  • QuerySet:

QuerySet 是一种用于执行数据库查询操作的对象集合。它可以被用于过滤、排序、聚合、连接等多种操作,以从数据库中检索数据。
QuerySet 是惰性加载的,即它不会立即执行查询,而是在需要实际数据时才触发执行。这使得可以通过链式操作逐步构建查询。
主要用途是检索和处理符合特定条件的数据集合,如获取满足特定条件的所有图书、对数据进行聚合计算等。
适用场景:

当您需要从数据库中获取满足特定条件的一组数据时,可以使用 QuerySet。
当需要进行数据库查询操作,如过滤、排序、分组等时,QuerySet 是合适的选择。
当需要构建动态的查询条件,使用链式方法来构建复杂查询时,QuerySet 很有用。

  • Instance:

Instance 指的是模型类的单个对象实例,对应于数据库表中的一行数据。每当您从数据库中获取一条记录,就得到了该模型的一个实例。
Instance 是通过模型类的方法和属性来访问和操作特定的数据库记录。
主要用途是对单个数据库记录进行操作,如创建、更新、删除等。
适用场景:

当您需要对数据库中的单个记录执行 CRUD(创建、读取、更新、删除)操作时,使用 Instance。
当您需要通过模型类的实例方法来执行特定的数据操作,例如保存修改、删除记录等时,Instance 是必要的。
QuerySet 用于执行数据库查询操作并返回数据集合,而 Instance 用于操作单个数据库记录。根据您的业务需求,可以在合适的情况下使用其中之一或两者的组合。

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

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

相关文章

智能在线客服系统,客户问题接待更及时

优质的客户服务可以提高客户的满意度和忠诚度,从而为企业带来更多的商业机会。智能在线客服系统,是指通过人工智能技术和自然语言处理技术,将客户的问题自动化地分配给相应的客服人员,从而实现客户问题的快速解答。相比传统的客服…

树结构使用实例---实现数组和树结构的转换

文章目录 一、为什么要用树结构?二、使用步骤 1.引入相关json2.树结构的转换总结 一、为什么要用树结构? 本文将讲述一个实例,构造一棵树来实现数组和tree的转换,这在前端树结构中是经常遇到的 后端返回树结构方便管理&#xff…

内核日志过滤

本操作以centos为例。 1、不想把日志存入到 /var/log/messages中,转存到其他文件 >1.1、修改配置文件 /etc/rsyslog.conf vim /etc/rsyslog.conf# 添加以下代码if $programname kernel and ($msg contains hexdump or $msg contains shentong_data_file) then …

防火墙firewall

一、什么是防火墙 二、iptables 1、iptables介绍 2、实验 138的已经被拒绝,1可以 三、firewalld 1、firewalld简介 关闭iptables,开启firewalld,curl不能使用,远程连接ssh可以使用 添加80端口 这样写也可以:添加http…

【服务器】Strace显示后台进程输出

今天有小朋友遇到一个问题 她想把2331509和2854637这两个进程调到前台来,以便于在当前shell查看这两个python进程的实时输出 我第一反应是用jobs -l然后fg (参考这里) 但是发现jobs -l根本没有输出: 原因是jobs看的是当前ses…

通过Matlab编程分析微分方程、SS模型、TF模型、ZPK模型的关系

微分方程、SS模型、TF模型、ZPK模型的关系 一、Matlab编程 微分方程、SS模型、TF模型、ZPK模型的关系二、对系统输出进行微分计算三、对系统输出进行积分计算四、总结五、系统的零点与极点的物理意义参考 :[https://www.zhihu.com/question/22031360/answer/3073452…

图像降采样的计算原理:F.interpolate INTER_AREA

一、F.interpolate——数组采样操作 torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode=nearest, align_corners=None, recompute_scale_factor=None) 功能:利用插值方法,对输入的张量数组进行上\下采样操作,换句话说就是科学合理地改变数组的尺…

Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行

Kotlin协程runBlocking并发launch&#xff0c;Semaphore同步1个launch任务运行 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom&…

C++初阶语法——new,delete开辟/销毁动态内存空间

前言&#xff1a;在C语言中&#xff0c;有malloc&#xff0c;realloc&#xff0c;calloc开辟动态内存空间&#xff0c;free销毁动态内存空间。而在C中&#xff0c;使用new开辟动态内存空间&#xff0c;delete销毁动态内存空间。不仅简化了操作&#xff0c;更为重要的是&#xf…

基于Java SpringBoot+vue+html 的地方美食系统(2.0版本)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,csdn、博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 系统流程的分析3.1 用户管理的流程3.2个人中心管理流程3.3登录流程 4系统设计…

【第16例】IPD开发流程:横向管理工具之袖珍卡

目录 前言 袖珍卡 作者介绍 相关课程 前言 IPD 本身是一个非常庞杂的体系&#xff0c;几乎涵盖了企业的方方面面。 不仅仅是华为&#xff0c;包括一些引入 IPD 的新星科技企业。 他们对 IPD 的引入也是走了先僵化再优化的一个过程。 比如说开始的阶段全盘照抄走流程&…

【Redis从头学-7】Redis中的Set数据类型实战场景之用户画像去重、共同关注、专属粉丝

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

matlab使用教程(20)—插值基础

1.网格和散点样本数据 插值是在位于一组样本数据点域中的查询位置进行函数值估算的方法。函数值是根据最接近查询点的样本数据点计算的。MATLAB 根据样本数据的结构&#xff0c;可以执行两种插值。样本数据可以形成网格&#xff0c;也可以是分散的。 网格化的样本数据使得插值…

Matlab使用

Matlab使用 界面介绍 新建脚本&#xff1a;实际上就是新建一个新建后缀为.m的文件 新建编辑器&#xff1a;ctrlN 打开&#xff1a;打开最近文件&#xff0c;以找到最近写过的文件 点击路径&#xff0c;切换当前文件夹 预设&#xff1a;定制习惯用的界面 常见简单指令 ;…

十亿次实验,用概率解读周易大衍筮法的奥秘

还记得封神电影里的文王占卜吗&#xff1f; 也就是著名的大衍筮法。 《易传》曰&#xff1a;大衍之数五十&#xff0c;其用四十有九。分而为二以象两&#xff0c;挂一以象三&#xff0c; 揲之以四以象四时&#xff0c;归奇于扐以象闰&#xff0c;五岁再闰&#xff0c;故再扐而…

解决云服务连接时长过短,不到一会儿自动断开

我们在使用xshell或者FinalShell连接云服务器操作时&#xff0c;总是十分钟就自动断开&#xff0c;很烦&#xff0c; 下面我们设置一下&#xff0c;让他可以使用很长时间&#xff08;需要有一定的linux命令的基础&#xff09; cd /etc/ssh 进入到ssh这个目录&#xff0c;查看…

k8s ingress

一、浅谈ingress &#xff08;ingress 是与service配合使用的&#xff09; Ingress能把Service&#xff08;Kubernetes的服务&#xff09;配置成外网能够访问的URL&#xff0c;流量负载均衡&#xff0c;及SSL&#xff0c;并提供域名访问的虚拟主机等&#xff0c;客户通过访问UR…

万界星空科技/免费MES系统/免费质量检测系统

质量管理也是万界星空科技免费MES中的一个重要组成部分&#xff0c;旨在帮助制造企业实现全面的质量管理。该系统涵盖了供应商来料、生产过程、质量检验、数据分析等各个环节&#xff0c;为企业提供了一站式的质量管理解决方案。 1. 实时质量监控 质量管理能够实时监控生产过程…

【使用 k 折叠交叉验证的卷积神经网络(CNN)】基于卷积神经网络的无特征EMG模式识别研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

攻防世界-warmup

原题解题思路 只有一张图片&#xff0c;就查看源代码&#xff0c;有一个source.php。 查看source.php&#xff0c;白名单中还有一个hint.php。 hint.php告诉我们flag的位置ffffllllaaaagggg 但是直接跳转是没用的&#xff0c;构造payload。 http://61.147.171.105:55725/sourc…