【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 models

class 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 models

class 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 models

class 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 models

class 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 用于操作单个数据库记录。根据您的业务需求,可以在合适的情况下使用其中之一或两者的组合。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录 1、享元模式(Flyweight Pattern)含义 2、享元模式的UML图学习 3、享元模式的应用场景 4、享元模式的优缺点 5、C实现享元模式的简单实例 1、享元模式(Flyweight Pattern)含义 享元模式(Flyweight&#xff09…

redis基本介绍以及在node中使用

文章目录 引言一、什么是redis1. redis简介2. redis的特点3. redis的应用场景 二、redis在windows下安装1. 下载安装2.验证是否安装成功3. 配置环境变量 三、redis-cli常用命令介绍1. redis-cli2. keys *3. set key value4. get key5. exists key6. del key7. info8. flushdb9.…

安装svn插件集成myeclipse2014

第一种: 直接借助myeclipse2014自己的help,当然外网这比较慢了,但是能解决问题的办法就是好办法,能更有效的就是更好的办法,得留着啊。 1.打开myeclipse的help---install from site http://subclipse.tigris.org/upd…

Android设置顶部状态栏颜色

Android设置顶部状态栏颜色_wx637304bacd051的技术博客_51CTO博客

在自定义数据集上使用 Detectron2 和 PyTorch 进行人脸检测

本文讲讲述如何使用Python在自定义人脸检测数据集上微调预训练的目标检测模型。学习如何为Detectron2和PyTorch准备自定义人脸检测数据集,微调预训练模型以在图像中找到人脸边界。 人脸检测是在图像中找到(边界的)人脸的任务。这在以下情况下…

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

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

vue3新建的项目如何配置

如何创建vue项目链接:http://t.csdn.cn/tX8wY 点击src删除一些没有用的东西 首先查看node_modules文件夹有没有pnpm文件夹,有的话删除node_modules文件夹 重新使用npm i进行安装 在APP.vue下面删除无用代码 删除前 删除后 在views下面找到Home首页删…

androidstudio Please specify a signing configuration for this variant (release)

当直接运行release版本时,报错Error: The apk for your currently selected variant cannot be signed. Please specify a signing configuration for this variant (package64-release). 解决报错:添加签名,signingConfigs 写在buildTypes前…

ffmpeg合并mp4视频文件

下载ffmpeg Download FFmpeg 2配置环境 右键此电脑-》属性-》高级系统设置 环境变量-》path 解压上面ffmpeg压缩包,找到bin目录,复制完整路径,添加到path环境变量中 测试ffmpeg ffmpeg合并MP4文件 创建一个文本文件,例如inpu…

C# 使用递归方法实现汉诺塔步数计算

C# 使用递归方法实现汉诺塔步数计算 Part 1 什么是递归Part 2 汉诺塔Part 3 程序 Part 1 什么是递归 举一个例子:计算从 1 到 x 的总和 public int SumFrom1ToX(int x) {if(x 1){return 1;}else{int result x SumFrom1ToX_2(x - 1); // 调用自己return result…

耕地单目标语义分割实践——Pytorch网络过程实现理解

一、卷积操作 (一)普通卷积(Convolution) (二)空洞卷积(Atrous Convolution) 根据空洞卷积的定义,显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图&…

巨人互动|Google开户Google Trends搜索数据分析工具介绍

Google Trends是一款免费的在线工具,可以帮助用户了解不同关键字和主题的搜索趋势,并分析它们在不同地理位置和时间段中的搜索活动。这个工具可以为各种用户提供极大的价值,包括商家、营销人员、媒体从业者和学术研究人员。在本文中&#xff…

vue中css修改滚动条样式

vue中css修改滚动条样式 效果图: 代码(在app.vue中全局增加下面样式即可): &::-webkit-scrollbar {width: 8px;height: 8px;border-radius: 3px;}/*定义滚动条轨道 内阴影圆角*/&::-webkit-scrollbar-track {//-webkit-box-shadow: inset 0 0 …

fatal: not a git repository (or any of the parent directories): .git

提示说没有.git这样一个目录 在命令行 输入 git init 然后回车就好了 git remote add origin https:/.git git push -u origin "master"

uniapp 企业微信侧边栏开发网页授权 注入企业权限 注入应用权限 获取userid(2)

1、网页授权,获取code 代码: oauthUrl() {const that thisuni.removeStorageSync(code)let REDIRECT_URI encodeURIComponent(window.location.href)let CORPID webConfig.appIdlet url https://open.weixin.qq.com/connect/oauth2/authorize?appi…

Tomcat运行后localhost:8080访问自己编写的网页

主要是注意项目结构,home.html放在src/resources/templates下的home.html下,application.properties可以不做任何配置。还有就是关于web包的位置,作者一开始将web包与tabtab包平行,访问8080出现了此类报错: Whitelabel…

不负众望~历时4年修炼,这本册子终于成书了(文末赠书)

名字:阿玥的小东东 学习:Python、C/C 主页链接:阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 精进Spring Boot首选读物 “小册”变“大书”,彻底弄懂Spring Boot 全方位配套资源…

中国算力大会丨看看中兴新支点国产系统如何提升算力

近日,由工业和信息化部、宁夏回族自治区人民政府共同主办的2023中国算力(基础设施)大会在宁夏银川拉开帷幕,为期三天的“算力中国”创新成果展精彩亮相。中兴新支点国产操作系统的亮相,引起现场众多嘉宾前来了解。 “中…

Istio入门体验系列——基于Istio的灰度发布实践

导言:灰度发布是指在项目迭代的过程中用平滑过渡的方式进行发布。灰度发布可以保证整体系统的稳定性,在初始发布的时候就可以发现、调整问题,以保证其影响度。作为Istio体验系列的第一站,本文基于Istio的流量治理机制,…

Certify The Web (IIS)

一、简介 Certify The Web 适用于 Windows的SSL 证书管理器用户界面,与所有 ACME v2 CA 兼容,为您的 IIS/Windows 服务器轻松地安装和自动更新来自 Letencrypt.org 和其他 ACME 证书授权机构的免费 SSL/TLS 证书,设置 https 从未如此简单。 …