跳转至主要内容

Python编程

解锁的Django ORM的核心用法系列(二)

Sprite
发表于 2023年11月18日

欢迎回到我们对Django ORM讲解系列的第二部分。在第一部分中,我们深入探讨了基本命令、模型和基本对象操作。在这一续篇中,我们将更深入地了解Django ORM提供的强大功能。我们将涵盖高级查询技术、处理多对多关系以及优化数据检索。

在这系列文章,我将分3篇来讲解Django ORM的核心用法
part 1: 解锁的Django ORM的核心用法系列(一)
part 2: 解锁的Django ORM的核心用法系列(二)(当前文章)

part 3: 解锁的Django ORM的核心用法系列(三)

比较

有四种常用的比较类型
  •  小于
  • 小于或等于
  •  大于
  • 大于等于
books = Book.objects.filter(publication_date__gte=date(2023, 10, 12))print(books)# <QuerySet [<Book: Python From Zero to Hero (596894049686)>]> 

包含

当我们不需要搜索精确的字符串,而是想要找到一个子字符串时,我们可以使用列名的 contains 方法与 filter 方法。
books = Book.objects.filter(title__contains="Pyt")print(books)# <QuerySet [<Book: Python From Zero to Hero (596894049686)>]>

排序

使用减号(-)在字段前面表示降序(desc)。另一方面,如果没有减号,则表示升序(asc)。
books = Book.objects.order_by("-publication_date")print(books)# <QuerySet [<Book: Python From Zero to Hero (596894049686)>, <Book: Javascript Mastery ()>]>
for book in books: print(book.publication_date)# 2023-10-12# 2022-05-06

将对象转换为字典

有时将对象转换为字典是很有用的。当您需要快速检查数据并查看可用的信息时,这尤其有帮助。
contributors = Contributor.objects.all()print(contributors.values())

排除

如果您想检索一个数据集,其中排除了满足特定条件的特定对象,您可以使用 exclude 方法。
contributors = Contributor.objects.exclude(first_name="Giovanni")print(contributors)# <QuerySet [<Contributor: Jozka Kukuricudus>, <Contributor: Anezka Nova>, <Contributor: Joe Doe>]>

在另一张表中搜索

如果您想搜索由特定出版商出版的图书,您可以使用一个模型来返回第二个表中的数据。在我们的情况下,这意味着我们想要搜索由某些特定出版商出版的图书。
books = Book.objects.filter(publisher__name="Oreilly")print(books)# <QuerySet [<Book: Python From Zero to Hero (596894049686)>]>

在另一张表中搜索(反向)

Django ORM可以自动检索与Publisher模型相关的数据,即使外键在Book模型中定义。
# class Publisher(models.Model):#     name = models.CharField(max_length=50, help_text="Publisher's name")#     website = models.URLField(help_text="Publisher's website")#     email = models.EmailField(help_text="Publisher's email")
publishers = Publisher.objects.get(book__title="Python From Zero to Hero")print(publishers) # Publisher: Oreilly

在一篇文章中,我们将更深入地了解Django ORM提供的高级查询功能,在后续的第三篇,我们将涵盖更多处理多对多关系、批量创建更新删除等功能。

评论已关闭。