Code前端首页关于Code前端联系我们

Django ORM详解:最全面的数据库处理指南

terry 2年前 (2023-09-24) 阅读数 63 #后端开发

深入探讨Django ORM的概念、基本用法、高级操作,详细分析如何处理实际使用的数据库操作。同时,我们讨论了对模型的透彻理解、执行CRUD操作以及对数据库迁移等高级主题的深入理解。我们也讨论了它的缺点并展望了它未来的发展。本文的目标是帮助大家全面了解Django ORM,了解它如何简化数据库操作,并通过皮肤了解其内部工作原理。

Django ORM简介

在详细讨论Django的ORM(对象关系映射)之前,我们先来了解一下什么是ORM。

ORM 是一种编程技术,可用于创建面向对象软件和关系数据库之间的兼容系统。简而言之,ORM 允许您使用 Python(或其他编程语言)来管理数据库,就像处理 Python 对象一样。

Django ORM 是一个非常强大的工具,可以帮助您管理和查询数据库。 Django ORM 的主要优点包括:

  • 您可以使用 Python 的对象模型执行数据库查询,而无需编写复杂的 SQL 语句。
  • 实现数据库平台独立性,因为Django ORM可以在许多数据库系统上运行。

下面我们用一个简单的例子来说明这个概念。假设我们有一个名为“博客”的模型,其中有一个名为“标题”的字段。通过Django ORM,我们可以轻松查询标题中包含“Django”的所有博客。

# 导入模型
from myapp.models import Blog

# 使用ORM进行查询
blogs = Blog.objects.filter(title__contains='Django')

# 输出查询结果
for blog in blogs:
    print(blog.title)

如果数据库中有名为“学习Django”和“Django ORM基础知识”的博客,上面的代码会输出:

Learning Django
Django ORM basics

看到这里,你就能体会到Django ORM的强大了:复杂的数据库操作都被转换了。融入到Python的对象操作中,大大提高了我们的编程效率。


Django ORM 工作机制和模型介绍

Django ORM 工作机制

Django ORM 将类映射到数据库表(表),将类的实例映射到表记录(记录),将类映射到数据库(列)字段。这样就可以使用Python代码来管理数据库,而无需编写SQL语句。

在Django ORM中,每个模型对应一个数据库表,模型的字段对应表的列,模型的实例对应表的行。

Django 模型简介

在 Django 中,模型是数据库表的高级抽象。通过定义模型,您可以显式指定数据库的结构,包括表名称、字段名称和类型以及可能的索引。

让我们看一个定义名为“Blog”的模型的简单示例:

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

在这个示例中,BlogBlog♼♼♼ 由字段组成: , 内容出版日期。每个字段对应一个数据库列类型:CharField对应字符类型,TextField对应文本类型,datedateField

from myapp.models import Blog

# 创建新的Blog实例
blog = Blog(title='My first blog', content='This is my first blog post.')
blog.save()  # don't forget to call save method

d和时间类型。


Django 模型 深入理解模型

定义模型

在 Django 中,模型是数据访问层的基本组件,它定义了数据最重要的行为。 Model 是 Python 类的子类django.db.models.Model。每个模型对应一个数据库表。

from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

在上面的示例中,我们定义了一个名为 Blog 的模型,它由三个字段组成:title

、 p ub_日期。

模型字段类型

Django 提供了许多内置字段类型来满足大多数数据库设计需求。例如:

  • CharField:字符字段,用于存储较短的字符串,例如地址。
  • 文本字段:文本字段,用于存储大量文本,例如博客内容。
  • DateTimeField:日期时间字段,用于存储日期和时间。

每种字段类型都有自己的参数,例如 CharField max_length 需要一个定义字段最大长度的参数。

模型关联关系

Django模型可以定义复杂的关系,包括一对一(OneToOne)、一对多(ForeignKey)和多对多(ManyToMany)关系。

例如,我们可以定义一个 Author 模型并将其与 Blog 模型关联: 模型 添加了 author是一个国外的领域键字段 (ForeignKey),指向模型 作者。这意味着每个博客文章都有一个作者,每个作者可以撰写多篇博客文章。

当我们删除作者时,参数on_delete=models.CASCADE确保所有相关博客也被删除。


Django ORM CRUD 操作

了解了 Django 模型后,我们来看看使用 Django ORM 执行常见的数据库操作:一般 Create、Retrieve、Update、Delete CRUD 我们称之为操作。

创建记录

在Django ORM中,我们可以通过创建模型实例来创建新记录。以下是创建新的 Blog 记录的示例:

from myapp.models import Blog

# 创建新的Blog实例
blog = Blog(title='My first blog', content='This is my first blog post.')
blog.save()  # don't forget to call save method

save() 方法将新的 Blog 保存到数据库中。

读取记录

Django ORM 提供了多种读取数据库中记录的方法。我们可以使用 all() 方法来检索所有记录,也可以使用 filter() 方法来检索符合指定条件的记录。

from myapp.models import Blog

# 获取所有Blog记录
blogs = Blog.objects.all()

# 输出所有Blog的标题
for blog in blogs:
    print(blog.title)

如果有一个名为“我的第一个博客”的博客,那么上面的代码给出如下:

My first blog

更新记录

更新数据库中的记录也非常容易。我们可以检索记录的副本,修改其属性,然后调用 save() 方法:

from myapp.models import Blog

# 获取第一个Blog记录
blog = Blog.objects.first()

# 更新标题
blog.title = 'My updated blog'
blog.save()

此代码更新数据库中第一个博客的地址。 ?博客。


高级Django ORM数据库操作

学习了基本的Django ORM操作后,我们来看看一些更高级的数据库操作,包括复杂查询、查询优化等等。

复杂查询

在Django ORM中,我们可以使用filter()、、 等方法进行复杂查询。

例如,我们可以找到所有标题中包含“django”一词的博客,并按照发布日期降序排序:

from myapp.models import Blog

# 获取所有标题包含'django'的Blog记录,并按照发布日期降序排序
blogs = Blog.objects.filter(title__contains='django').order_by('-pub_date')

# 输出这些Blog的标题
for blog in blogs:
    print(blog.title)

如果有标题中包含“django”的博客,则上面的代码按发布日期降序排列命令写下他们的地址。出版日期顺序。

查询优化

查询优化对于大型数据库非常重要。 Django ORM 提供了多种用于查询优化的工具,包括 select_lated()prefetch_lated()

select_lated()可以一次性获取与查询对象关联的ForeignKey对象,这样可以减少数据库查询次数:

from myapp.models import Blog

# 获取所有Blog记录,并一次性获取每个Blog的author信息
blogs = Blog.objects.select_related('author').all()

# 输出Blog的标题和作者名
for blog in blogs:
    print(blog.title, blog.author.name)

如果有一篇博客,作者名为“John”,标题为“John” 《我的第一篇博客》,上面的代码会输出:

My first blog John

prefetch_lated()对于ManyToMany和一对多关联也非常有用。您可以一次获取所有相关对象并减少数据库查询次数。


使用数据库限制来确保数据一致性。数据库一致性。
# 例子:使用unique约束确保每个作者的email是唯一的
class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)

使用批处理操作来提高性能

Django ORM提供了bulk_create和和等方法,使我们能够更高效地创建bulk_update和update。 。

# 例子:使用bulk_create方法批量创建对象
authors = [Author(name=f'Author {i}') for i in range(1000)]
Author.objects.bulk_create(authors)  # 这个操作只需要一次数据库查询

使用原生SQL

虽然Django ORM提供了许多强大的查询工具,但有时您可能需要直接执行SQL语句。 Django ORM 允许您执行本机 SQL。您可以使用 raw() 方法或 cursor() 方法来执行原生 SQL:

from django.db import connection

# 使用cursor()执行原生SQL
with connection.cursor() as cursor:
    cursor.execute("SELECT title FROM myapp_blog")
    row = cursor.fetchone()

print(row)

此代码直接执行 SQL 查询和打印。博客。虽然Django ORM提供了.raw()方法可以让我们直接执行SQL查询,但是这种方法应该尽量避免,因为它会导致SQL注入等安全问题,而且Django ORM的很多优点都失去了它。


Django 数据库迁移

Django 的数据库迁移系统会自动将模型更改(添加字段、删除模型等)转换为 SQL 命令并在数据库中执行这些命令。这是一种数据库版本控制方法,允许您修改模型和更新数据库。

创建迁移

当您对模型进行更改(例如添加字段、更改字段类型等)时,您必须创建迁移以将这些更改应用到数据库。您可以使用命令 makemigrations 创建迁移:

python manage.py makemigrations your_app_name

上面的命令检查模型和数据库的当前状态,然后创建一个新的迁移,其中包含将数据库更新到新状态的步骤。 。所有必要的操作。 † 健康)状况。

查看迁移状态

可以使用showmigrations命令查看所有迁移的状态(已应用和未应用):可以帮助您了解数据库当前的状态。

恢复迁移

有时您可能需要撤消迁移。您可以使用命令 migrate 和迁移名称(或迁移名称之前的名称)撤消迁移:

python manage.py migrate your_app_name 0001

使用此命令撤消名为 0002 的迁移(以及所有后续迁移)。 ) ) 并将数据库回滚到 0001 状态。


Django ORM 的缺点

虽然 Django ORM 是一个高效便捷的工具,但它也并非万无一失。了解这些限制可以帮助您就何时以及如何使用它们做出更明智的决定。

性能开销

Django ORM 需要额外的处理才能将数据库行转换为 Python 对象。这意味着使用 Django ORM 通常会比直接使用 SQL 语句慢。然而,这种额外的性能通常是可以接受的,除非我们正在处理非常大量的数据。

不支持一些复杂的SQL查询

虽然Django ORM支持很多SQL功能,但是有一些复杂的SQL查询无法通过Django ORM的查询API实现。例如,对于某些数据库服务或特殊的SQL函数,您可能需要编写原生SQL语句。

需要更多的学习和理解

虽然Django ORM可以帮助你避免直接编写SQL,但你仍然需要了解数据库的基本概念才能有效地使用它。另外,Django ORM 自己的 API 和服务需要一些学习和理解。隐藏数据库可能会导致误解,例如,一个看似简单的操作可能会触发多个数据库查询。

# 例子:看似简单的操作实际上引发了多次数据库查询
for book in Book.objects.all():
    print(book.author.name)  # 这个操作对每本书都会引发一个数据库查询

在这个例子中,打印每本书的作者姓名,实际上是对每本书启动了一次数据库查询,如果书很多,查询会很慢。这是因为 Django ORM 默认为延迟加载,这意味着它仅在需要时从数据库检索数据。


Django ORM总结与展望

学习完本文后,我们彻底了解了Django ORM的工作原理,执行了一些基本和高级的数据库操作,并了解了它的一些最佳实践和局限性。 。

Django ORM 是 Python Web 开发的重要组成部分。它以其简单性和强大的功能赢得了许多开发者的喜爱。虽然它有局限性,比如对一些复杂查询的支持不太好,隐藏数据库操作会导致性能问题,但总的来说,Django ORM是一个非常强大的工具,可以帮助你更快地开发出更好的Web。

未来,我们可以期待 Django ORM 继续发展,提供更多的功能和更好的性能。同时,通过深入的学习和实践,我们可以更好地利用Django ORM,提高我们的开发效率。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门