
解锁的Django ORM的核心用法系列(三)
Sprite
发表于 2023年11月18日
欢迎回到我们对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
在本系列的最后一篇文章中,我们更深入地展示高级查询技巧、处理多对多关系、批量创建更新删除等功能。
往期推荐
Previous Post
解锁的Django ORM的核心用法系列(二)评论已关闭。