跳转至主要内容

Python编程

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

Sprite
发表于 2023年11月18日

欢迎回到我们对Django ORM讲解系列的最后一部分。在之前的部分中,我们深入探讨了基本命令、数据建模和基本对象操作。现在,我们将更深入地展示高级查询技巧、处理多对多关系以及优化数据检索。


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

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

从外键获取数据(反向)

如果我们想要搜索出所有来自出版商对象的书籍,我们可以在其上调用 book_set.all() 。


publishers = Publisher.objects.get(name="Oreilly")print(publishers.book_set.all())# <QuerySet [<Book: Python From Zero to Hero (596894049686)>]>

多个条件

如果我们想要使用多个条件,我们可以链接多个filter()方法。


books = Book.objects.filter(publisher__name="Oreilly").filter(title__contains="From Zero to Hero")print(books)# <QuerySet [<Book: Python From Zero to Hero (596894049686)>]>

多对多 – 从外键获取数据

我们还可以使用 filter 方法来处理多对多的条件。由于 Contributor 表没有 title 列,我们可以将 book__title 组合起来在 book 表中搜索标题。


contributors = Contributor.objects.filter(book__title="Python From Zero to Hero")print(contributors)# <QuerySet [<Contributor: Jozka Kukuricudus>, <Contributor: Anezka Nova>]>


多对多 – 通过外键访问数据

如果我们从定义了多对多字段的模型开始,我们可以使用 all 方法直接访问该字段。


book = Book.objects.get(pk=1)print(book.contributors.all())# <QuerySet [<Contributor: Jozka Kukuricudus>, <Contributor: Anezka Nova>]>

更新数值

要更新特定行或一组行,我们可以将其与 filter 和 update 方法结合使用。


changed = Contributor.objects.filter(last_name="Doe").update(last_name="Alonso")print(changed)  # 1

按主键删除

要删除一行,我们可以通过其主键找到它,然后调用 delete 方法。


Book.objects.get(pk=1).delete()

批量创建

我们还可以使用 bulk_create 方法一次创建多行。


Publisher.objects.bulk_create([    Publisher(name="Alfonsovi knihy", website="https://alfos.cz", email="alfo@gmail.com"),    Publisher(name="Strejdovi dzouky", website="https://ustryca.cz", email="strycojozo@gmail.com"),])

批量更新

与之前的示例类似,我们可以更新多行。首先,我们需要找到要更新的对象,进行所需的列更改,然后使用 bulk_update 方法与更新后的对象列表。


publishers = [Publisher.objects.get(name="Alfonsovi knihy"), Publisher.objects.get(name="Strejdovi dzouky")]publishers[0].website = "https://alfous.com"publishers[1].website = "https://strejdafranto.cz"
Publisher.objects.bulk_update(publishers, ["website"])

高级条件与Q

想象一下,你想要输入这个查询 — SELECT * FROM book WHERE title LIKE '%From Zero%' OR name LIKE %Python%; 我们可以使用 Q 模块来完成这个任务。 | 意味着 OR ,而 & 意味着 AND 。


from django.db.models import Q
publishers = Publisher.objects.filter(Q(name__startswith="Or") | Q(name__startswith="Strej"))print(publishers)# <QuerySet [<Publisher: Publisher: Oreilly>, <Publisher: Publisher: Strejdovi dzouky>]>
publisher = Publisher.objects.get(name="Strejdovi dzouky")print(publisher)# Publisher: Strejdovi dzouky
print(publishers.contains(publisher))# True


在本系列的最后一篇文章中,我们更深入地展示高级查询技巧、处理多对多关系、批量创建更新删除等功能。

往期推荐

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

评论已关闭。