Django ORM 用於數據查詢是 Django 最強大的功能之一。 QuerySet 是從 Django 模型高效提取數據的基本工具,使用這個工具可以輕鬆處理複雜的數據查詢。本文將探討 QuerySet 是什麼、如何使用它 以及 對數據查詢有用的各種功能。
1. QuerySet 是什麼?
QuerySet 是在 Django ORM 中用於從數據庫獲取或操作數據的對象集。簡而言之, QuerySet 是查詢數據庫(Query)執行結果的集合。使用 QuerySet 可以提取、過濾和操作模型對象。
QuerySet 封裝了與數據庫的交互,使開發者無需直接編寫 SQL,就可以通過直觀的 Python 代碼查詢或操作數據。

使用 QuerySet 可以做到的事情
- 數據查詢:可以根據各種條件查詢存儲在數據庫中的記錄。
- 過濾:可以應用多種條件來篩選所需數據。
- 排序和切片:可以按所需順序對數據進行排序或提取特定範圍的數據。
2. 基本查詢方法的種類和示例
Django ORM 提供了多種基本查詢方法,這些方法在查詢和過濾數據時非常有用。
2.1 all()
當想要提取模型中的所有數據時使用的方法。
from myapp.models import Post
posts = Post.objects.all()
Post.objects.all()
會提取存儲在 Post 模型中的所有對象。
2.2 filter()
當想要提取符合特定條件的對象時使用。
published_posts = Post.objects.filter(status='published')
filter()
查詢符合條件的對象,返回結果是 QuerySet。
2.3 exclude()
當想要提取排除特定條件的對象時使用。
draft_posts = Post.objects.exclude(status='published')
exclude()
對應於filter()
,查詢不符合條件的對象。
2.4 get()
當想要提取符合特定條件的單個對象時使用。注意, 如果找不到符合條件的對象或有多於一個對象,將會發生錯誤。
post = Post.objects.get(id=1)
get()
專門用於查詢確切一個對象,若無結果或有多個,會導致DoesNotExist
或MultipleObjectsReturned
的異常。
3. ORM 的運算符與過濾
QuerySet 可以使用多種運算符來處理複雜的過濾條件。這些運算符使得可以根據非常詳細的條件篩選數據。
3.1 exact
用於查找 完全匹配的值。
post = Post.objects.filter(title__exact='My First Post')
title__exact
過濾標題完全為'My First Post'
的對象。
3.2 icontains
用於不區分大小寫地查詢 是否包含部分字符串。
posts = Post.objects.filter(title__icontains='django')
title__icontains
查詢標題中包含'django'
的所有帖子。
3.3 gt
, lt
(大於,小於)
當需要設置數字或日期值的 大於或小於 條件時使用。
recent_posts = Post.objects.filter(publish_date__gt='2024-01-01')
publish_date__gt
過濾2024-01-01
之後發布的帖子。gt
代表 greater than,lt
代表 less than。
此外,還可以使用 startswith
、endswith
和 in
等多種運算符,以簡單實現 多種過濾條件。
4. 反向查詢:查詢通過外鍵連接的模型之間的關係
在 Django ORM 中,反向查詢 是通過使用外鍵(Foreign Key)來查詢連接模型之間的關係。利用反向查詢,可以方便地查詢關聯型數據庫中的 父子關係。
4.1 使用 related_name
的反向查詢
在定義外鍵時使用 related_name
選項,能使反向查詢時使用更易讀的名稱。
示例
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
text = models.TextField()
用法
post = Post.objects.get(id=1)
comments = post.comments.all()
post.comments.all()
可以提取該文章的 所有評論。如果沒有設置related_name
,則默認使用comment_set
作為名稱。
結論
Django ORM 的 QuerySet 是一個強大的工具,用於與數據庫交互,通過多種方法和運算符有效地查詢和操作所需數據。本文探討了 QuerySet 的基本使用方法,以及如何過濾數據和進行反向查詢。
上述所介紹的僅是 ORM 查詢功能的基礎入門。實際上,Django 的 QuerySet 擁有更多的多樣和強大的方法,這些方法可以組合使用以查詢數據。未來我將編寫一篇文章來逐一介紹和分析 QuerySet 的各種方法。
下一篇將會討論 QuerySet 的性能優化 和 延遲評估(lazy evaluation) 的概念,讓我們一起了解更好的數據訪問方式。敬請期待!
Add a New Comment