Django ORM 查询 | 如何使用 ORM 查询2025年03月17日 | 阅读 9 分钟 在本教程中,我们将完整讨论 Django ORM 查询以及如何使用它们来操作数据。 Django ORM 是 Django 最好的工具之一,在执行数据库相关任务方面发挥着至关重要的作用。它以一种很大程度上与数据库无关的方式提供了数据库的抽象。 Django ORM 提供了易于使用的抽象。它秉承“让简单的事情更简单,让困难的事情成为可能”的理念。 在这里,我们将详细解释每个 ORM 查询,并查看它们对应的 SQL 查询。 使用 Model 在数据库中创建表首先,我们将使用 Django 模型创建一个示例数据库,其中包含一些数据,然后我们将在该数据库上运行查询。 model.py 然后运行以下命令。 我们已准备好运行查询。 如何从表(Model)获取所有记录我们有一个名为 Student 的模型。要从模型获取所有记录,我们将使用 Student.objects.all()。为此,请打开 Django shell 来运行查询。 您可能想知道 Django ORM 是如何执行我们的查询的,或者我们编写的代码对应的查询是什么。获取 SQL 查询非常简单,我们需要使用 str() 并将 queryset 对象连同查询一起传递。 对应的 SQL 查询 ![]() 如何向表(Model)添加记录我们将使用 Student.objects.create() 并将字段及其值作为参数传递。让我们看下面的例子。 请注意,我们需要在查询对象上使用 .save() 方法来将新创建的记录保存在表中,否则它将不会显示在数据库中。 从 QuerySets 中检索单个对象假设我们需要一个查询集中的特定对象来匹配结果。我们可以使用 get() 方法来做到这一点。get() 直接返回单个对象。让我们看下面的例子。 示例 - 示例 - 2 正如我们在两个示例中看到的,我们获得的是单个对象而不是单个对象的查询集。如果没有任何结果匹配查询,get() 将引发 DoesNotExist 异常。另一方面,如果有多个字段匹配,它将引发 MultipleObjectReturned,这是模型类本身的属性。 过滤记录在前面的示例中,all() 返回的 QuerySet 描述了数据库表中的所有记录。但有时,我们需要选择对象集合的子集,这可以通过添加 filter 条件来完成。 在下面的示例中,我们将获取名字以 R 开头的数据。 注意 - get() 和 filter() 方法的区别在于,filter() 方法返回对象(s)的查询集,而 get() 方法返回单个对象。使用 exclude() 方法它返回一个包含不匹配给定查找参数的对象的新 QuerySet。换句话说,它根据查找条件排除了记录。让我们理解下面的例子。 输出
如何在 Django ORM 中进行 OR 查询?当我们使用两个或多个条件过滤记录时,会执行 OR 操作。在下面的示例中,我们将获取名字以 'A' 开头且姓氏以 'M' 开头的学生。 Django 允许我们通过两种方式来实现这一点。
我们获取名字以 'A' 开头且姓氏以 'S' 开头的学生详细信息。 让我们看看对应的 OR 运算符的 SQL 查询。 如何在 Django ORM 中进行 AND 查询?当我们需要匹配两个或多个条件的记录时,会执行 AND 操作。在下面的示例中,我们将获取名字以 'P' 开头且姓氏以 'S' 开头的学生。 Django 允许我们通过三种方式来实现这一点。
只有一条记录满足给定条件。 我们也可以使用以下查询。 或 所有查询都将得到相同的结果。 一次创建多个对象有时我们想一次创建多个对象。假设我们想一次性创建新对象,并且不想执行多个数据库查询。Django ORM 提供了 bulk_create 来一次性创建多个对象。 让我们一次性创建多条记录。 现在,我们的数据库表将更新。bulk_create 接受一个未保存对象的列表。 限制 QuerySets我们可以使用 Python 列表的切片语法来设置查询集的限制。这相当于 SQL 的 LIMIT 和 OFFSET 子句。让我们看下面的查询。 下面的查询将返回 第一条 记录到 第五条 记录。 不支持负索引。但是,我们可以在 QuerySets 中使用 步长。 要获取单个记录,我们可以执行以下操作。 如何按升序或降序排序 QuerySets?Django 提供了 order_by 方法来排序 queryset。此方法接受我们想要排序 (升序和降序) 结果的 字段名。让我们看下面的例子。 示例 - 升序 对于降序,我们将在查询字段前使用 Not '-'。 我们也可以在 order_by 函数中传递多个字段。 如何按关联模型的字段 (带外键) 排序?现在,我们将学习如何按关系模型排序数据。我们创建了另一个名为 Teacher 的模型,它是 Student 模型的相关模型。 型号 我们添加了教师姓名,每个教师都与学生相关联。现在我们想按 teacher_name 对学生进行排序,在每个 teacher_name 中再按学生姓名排序。我们可以这样做。 重要字段查找查询字段查找只不过是一种条件,它指定了与 SQL WHERE 子句相同的内容。它们以关键字参数的形式给出到 QuerySet 方法,如 filter(), exclude() 和 get()。 示例 - 这与以下 SQL 查询相同 让我们理解一些重要的查找。
它根据搜索返回精确结果。 查找应该在 __ 双下划线 之后使用。我们可以使用不区分大小写的版本,称为 iexact。
它用于区分大小写的测试。让我们看下面的例子。 如果我们将 SQL 查询翻译过来,它将如下所示。 还有一个不区分大小写的版本,称为 icontains。 如何在 Django 中执行 join 操作SQL join 操作根据它们之间的公共字段将来自两个或多个表的单据或行组合起来。我们可以通过多种方式执行 join 操作。让我们理解下面的例子。 如何在 Django ORM 中对记录进行分组?Django ORM 使用 Max, Min, Avg, Sum 等聚合函数提供分组功能。有时我们需要从对象中获取聚合值。让我们理解下面的例子。 如何使用 Django ORM 执行类似 truncate 的操作?SQL 中的 Truncate 意味着清除表数据以供将来使用。Django 没有提供截断表的内置方法,但我们可以使用 delete() 方法获得类似的结果。让我们理解下面的例子。 如果你想删除单个对象实例,你需要调用该模型单个实例上的 delete() 方法。我们调用了模型上的 delete() 方法,所以它删除了所有数据。 如何获取数据的并集Union 意味着获取两个查询集中共有的记录。让我们看看如何做到这一点。 null=True 和 blank=True 之间有什么区别?在 Django 中,我们经常使用 null 和 blank,默认情况下它们的值为 False。这两个值都在字段级别工作,我们希望将字段保留为 null 或 blank。这两个值看起来相似,但使用方式不同。 如果 null=True 意味着字段值设置为 NULL,即无数据。它基本上是用于数据库列值。 blank = True 指定字段在表单中是否是必需的。 如果我们设置 null=True blank=True,则意味着该字段在所有情况下都是可选的。 结论在本教程中,我们学习了一些重要的 ORM 查询。Django ORM 是一个强大的工具,也是 Django 的关键支柱之一。Django 自带内置数据库 SQLite。我们描述了 ORM 查询,它们的作用与 SQL 查询相同。 下一主题Django 表单部件 |
我们请求您订阅我们的新闻通讯以获取最新更新。