了解 Django ORM
什麼是 ORM?
物件關聯映射(ORM)是 Django 中的一項功能,它允許我們使用 Python 程式碼與資料庫交互,而無需編寫 SQL 查詢。 ORM 在底層將 CRUD 操作轉換為 SQL,因此可以輕鬆建立、擷取、更新和刪除資料庫物件。
使用 ORM
在 Django 中,模型類別代表資料庫表,該類別的實例代表表中的一筆記錄。
每個模型至少有一個Manager,稱為物件。我們可以透過這個管理器從資料庫中檢索記錄,從而產生一個 QuerySet。
查詢集是惰性的,這表示在明確請求之前不會取得結果。
常用的 QuerySet 方法
filter():檢索符合特定條件的記錄。
all(): 檢索所有記錄。
order_by():根據特定欄位對記錄進行排序。
unique():傳回唯一記錄。
annotate():為每筆記錄新增聚合值。
aggregate():從查詢集中計算一個值。
defer():僅載入模型的某些字段,延遲其他字段。
進階 ORM 功能
Q 和 F 物件 允許複雜的查詢和高效的資料庫層級操作。對於涉及 OR 條件的查詢,我們可以使用“Q”,而“F”則允許您在查詢中直接引用模型欄位。
from django.db.models import Q, F # Using Q to filter published posts or created after a specific date posts = Post.objects.filter(Q(status='published') | Q(created_at__gte='2024-01-01')) # Using F to compare fields within a model (e.g., for a discount calculation) class Product(models.Model): name = models.CharField(max_length=100) price = models.DecimalField(max_digits=10, decimal_places=2) discounted_price = models.DecimalField(max_digits=10, decimal_places=2) # Retrieve products where discounted price is less than price discounted_products = Product.objects.filter(discounted_price__lt=F('price'))
查詢表達式(引用模型欄位)和資料庫函數(應用類似SQL的函數)都允許我們在資料庫層級執行操作,而不是將資料拉入Python進行處理。這有助於優化查詢並減少資料庫負載。
from django.db.models import Count, Max # Count the number of posts for each status status_count = Post.objects.values('status').annotate(count=Count('id')) # Get the latest created post latest_post = Post.objects.aggregate(latest=Max('created_at'))
自訂管理器讓我們新增額外的管理器方法或修改管理器最初傳回的查詢集。
class PublishedManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(status='published') class Post(models.Model): title = models.CharField(max_length=255) content = models.TextField() status = models.CharField(max_length=50) created_at = models.DateTimeField(auto_now_add=True) objects = models.Manager() # Default manager published = PublishedManager() # Custom manager for published posts # Use the custom manager to get published posts published_posts = Post.published.all()
ContentType 是一個模型,可用於在模型之間建立通用關係,而無需使用直接外鍵指定它們。常見用例包括需要附加到不同類型模型的註釋或標籤。
from django.contrib.contenttypes.models import ContentType # Example model for comments class Comment(models.Model): content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') text = models.TextField() # Creating a comment for a Post instance post = Post.objects.get(id=1) comment = Comment.objects.create( content_type=ContentType.objects.get_for_model(Post), object_id=post.id, text='Great post!' )
交易將資料庫操作捆綁為一個單元,確保資料一致性。我們可以使用 @transaction.atomic 裝飾器或 transaction.atomic() 上下文管理器將程式碼包裝在事務區塊中。
from django.db import transaction # Using a transaction block with transaction.atomic(): post = Post.objects.create(title='New Post', content='Content here...', status='published') # Any other database operations will be part of this transaction
Django 允許在需要彈性的情況下執行原始 SQL 查詢 進行複雜查詢。但需謹慎使用。
from django.db import connection def get_published_posts(): with connection.cursor() as cursor: cursor.execute("SELECT * FROM blog_post WHERE status = %s", ['published']) rows = cursor.fetchall() return rows
結論
Django 的 ORM 透過提供用於處理模型、管理器和查詢的高階 API 來簡化資料庫互動。了解和利用這些功能可以大大提高您的工作效率和應用程式的效能。
以上是了解 Django ORM的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。
