Django 中的 ORM 基礎語法

深入剖析 Django 中的 ORM 語法:從基礎到實戰進階

在 Django 開發領域,ORM(對象關系映射)是開發者高效操作數據庫的得力工具。它以簡潔直觀的 Python 代碼,替代繁瑣的 SQL 語句,極大提升了開發效率。本文將聚焦 Django 中的 ORM 語法,通過豐富的示例與場景分析,助你全面掌握其核心用法與進階技巧。

一、Django ORM 基礎架構

1.1 模型類定義

Django 通過models.py文件定義模型類,每個模型類對應數據庫中的一張表,類屬性則對應表中的列。例如,定義一個簡單的博客文章模型:

from django.db import modelsclass Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()pub_date = models.DateTimeField(auto_now_add=True)

上述代碼中,title使用CharField表示固定長度的字符串字段;content通過TextField存儲長文本;pub_date采用DateTimeField記錄文章發布時間,auto_now_add=True確保在創建記錄時自動填充當前時間。

1.2 字段類型詳解

Django 提供了豐富的字段類型,除上述類型外,還有:

  • IntegerField:用于存儲整數值,如文章的點贊數。
  • BooleanField:表示布爾值,常用于標記文章是否置頂、是否為精華內容等。
  • ForeignKey:建立表與表之間的一對多關系,例如文章與作者的關聯。
  • ManyToManyField:處理多對多關系,如文章與標簽之間的關系。

定義外鍵關系示例:

class Author(models.Model):name = models.CharField(max_length=100)class Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(Author, on_delete=models.CASCADE)

on_delete=models.CASCADE表示當關聯的作者被刪除時,其對應的文章也會被級聯刪除。

二、Django ORM 常見操作語法

2.1 創建數據

創建數據實例有兩種常見方式。第一種是直接實例化模型類并調用save方法:

author = Author(name="張三")
author.save()article = Article(title="Django ORM入門", content="...", author=author)
article.save()

第二種是使用create方法,該方法在創建實例的同時保存到數據庫:

article = Article.objects.create(title="Django ORM實戰", content="...", author=author)

2.2 查詢數據

2.2.1 基礎查詢

獲取所有文章:

all_articles = Article.objects.all()

獲取單篇文章(通過主鍵):

article = Article.objects.get(pk=1)

注意,使用get方法時若記錄不存在會拋出DoesNotExist異常,若存在多條符合條件的記錄則會拋出MultipleObjectsReturned異常,因此需謹慎使用。

2.2.2 條件查詢

Django 支持豐富的查詢條件,通過雙下劃線(__)連接字段和查詢條件:

  • 精確匹配:查詢標題為 “Django ORM 實戰” 的文章
    articles = Article.objects.filter(title="Django ORM實戰")
  • 模糊查詢:查詢標題包含 “Django” 的文章
    articles = Article.objects.filter(title__icontains="Django")

icontains表示不區分大小寫的包含查詢,還有contains(區分大小寫)、startswith(以... 開頭)、endswith(以... 結尾)等類似條件。

  • 范圍查詢:查詢發布時間在某一范圍內的文章
  • from django.utils import timezone
    articles = Article.objects.filter(pub_date__range=(timezone.now() - timezone.timedelta(days=7), timezone.now()))

2.3 更新數據

先獲取實例,修改屬性后調用save方法:

article = Article.objects.get(pk=1)
article.title = "更新后的文章標題"
article.save()

也可以使用update方法批量更新:

Article.objects.filter(pub_date__lt=timezone.now() - timezone.timedelta(days=30)).update(is_published=False)

2.4 刪除數據

刪除單個實例:

article = Article.objects.get(pk=1)
article.delete()

批量刪除:

Article.objects.filter(pub_date__lt=timezone.now() - timezone.timedelta(days=365)).delete()

三、Django ORM 進階應用

3.1 關聯關系操作

3.1.1 一對多關系

以上述Author和Article的一對多關系為例,查詢某個作者的所有文章:

author = Author.objects.get(pk=1)
articles = author.article_set.all()

反向查詢,即通過文章獲取作者:

article = Article.objects.get(pk=1)
author = article.author
3.1.2 多對多關系

定義文章與標簽的多對多關系:

class Tag(models.Model):name = models.CharField(max_length=50)class Article(models.Model):title = models.CharField(max_length=200)content = models.TextField()tags = models.ManyToManyField(Tag)

為文章添加標簽:

article = Article.objects.get(pk=1)
tag1 = Tag.objects.create(name="Django")
tag2 = Tag.objects.create(name="ORM")
article.tags.add(tag1, tag2)

查詢包含特定標簽的文章:

articles = Article.objects.filter(tags__name="Django")

3.2 聚合與分組查詢

聚合查詢用于計算總和、平均值、計數等統計信息,需導入django.db.models中的聚合函數:

  • 統計文章總數
from django.db.models import Count
article_count = Article.objects.count()
  • 計算文章平均點贊數(假設 Article 模型有 likes 字段)
from django.db.models import Avg
average_likes = Article.objects.aggregate(Avg('likes'))

分組查詢結合annotate方法使用,例如統計每個作者的文章數量:

from django.db.models import Count
authors_with_article_count = Author.objects.annotate(article_count=Count('article'))
for author in authors_with_article_count:print(f"{author.name} 發表了 {author.article_count} 篇文章")

3.3 事務處理

Django 通過transaction.atomic裝飾器或上下文管理器確保數據庫操作的原子性。例如,同時更新文章和作者信息:

from django.db import transaction@transaction.atomic
def update_article_and_author():with transaction.atomic():article = Article.objects.get(pk=1)article.title = "更新后的文章標題"article.save()author = article.authorauthor.name = "更新后的作者名"author.save()

若在事務塊內發生異常,所有操作將回滾,保證數據一致性。

四、Django ORM 性能優化策略

4.1 避免 N+1 問題

N+1 問題常出現在處理關聯關系查詢時。例如,獲取所有作者及其文章,若不優化會執行 1 次查詢獲取作者列表,再為每個作者執行 1 次查詢獲取其文章,導致大量數據庫查詢。

使用select_related優化一對多關系查詢:

authors = Author.objects.select_related('article').all()

prefetch_related用于優化多對多或反向一對多關系:

articles = Article.objects.prefetch_related('tags').all()

4.2 索引優化

根據常用查詢條件,在模型字段上添加索引可顯著提升查詢性能。例如,為文章標題字段添加索引:

class Article(models.Model):title = models.CharField(max_length=200, db_index=True)content = models.TextField()pub_date = models.DateTimeField(auto_now_add=True)

通過db_index=True即可為該字段創建索引,但需注意索引并非越多越好,過多索引會影響數據插入和更新性能。

五、總結

Django 的 ORM 語法功能強大且靈活,從基礎的數據增刪改查,到復雜的關聯關系處理、聚合分組查詢,再到性能優化,都為開發者提供了高效便捷的解決方案。在實際項目中,熟練掌握這些語法和技巧,能幫助我們構建出性能優良、易于維護的數據庫驅動應用。隨著對 Django ORM 理解的深入,不斷在實踐中探索,你將在 Web 開發領域更游刃有余。如果你在使用過程中有新的發現或遇到問題,歡迎在評論區交流分享!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81913.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

A10服務器使用vllm推理框架成功運行Qwen3大模型

1.下載Qwen3大模型: git clone https://www.modelscope.cn/Qwen/Qwen3-1.7B.git放在服務器的/mnt/workspace/Qwen3-1.7B目錄下。 2.創建python虛擬環境: python3 -m venv venv1 source venv1/bin/activate3.安裝vllm推理框架 pip install vllm 4.啟動…

Disruptor—1.原理和使用簡介

大綱 1.Disruptor簡介 2.Disruptor和BlockingQueue的壓測對比 3.Disruptor的編程模型 4.Disruptor的數據結構與生產消費模型 5.RingBuffer Disruptor Sequence相關類 6.Disruptor的WaitStrategy消費者等待策略 7.EventProcessor EventHandler等類 8.Disruptor的運行…

谷歌瀏覽器調試python pygui程序

谷歌瀏覽器地址:chrome://inspect/#devices 前端vue為8080, 配置如下 pychat 需要配置環境變量 PYTHONUNBUFFERED1;QTWEBENGINE_REMOTE_DEBUGGING9012

手寫Tomcat(二)—Tomcat簡化模型架構

一、 Tomcat架構 Tomcat的主要角色是 servlet容器,提供一個解釋器,能夠解析并執行JavaScript Object Notation (JON)腳本(后更改為Servlet),并將請求傳送到指定的服務器(如JavaBean)。因此&…

Android 網絡全棧攻略(五)—— 從 OkHttp 攔截器來看 HTTP 協議二

上一篇我們介紹了 OkHttp 的責任鏈以及第一個內置攔截器 —— 重試與重定向攔截器。本篇我們將剩余四個攔截器的解析做完。 1、橋接攔截器 BridgeInterceptor 作為請求準備和實際發送之間的橋梁,自動處理 HTTP 請求頭等繁瑣工作。比如設置請求內容長度&#xff0c…

JDBC-java操作數據庫

1.基本結構: package com.atguigu.servlets;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDBCemo {public static void main(String[] args) throws Exception{String url "jdbc:mysql:///mysql&qu…

七彩喜適老化改造:讓每個空間成為長者尊嚴的守護者

隨著我國老齡化進程的加速,居家養老逐漸成為老年人首選的生活方式。 為了讓老年人能夠在熟悉的環境中安享晚年,適老化改造應運而生。 七彩喜作為居家養老服務的創新者,致力于通過科學設計和人性化改造,為老年人提供安全、舒適、…

【動態規劃】5 從一次函數出發推導斜率優化dp

背景 基于例題《任務安排》逐步推導進行斜率優化。 引入 例題:P2365 任務安排 考慮動態規劃。使用 d p i , j dp_{i,j} dpi,j? 表示前 i i i 個任務分了 j j j 段的最小費用。 顯然,有 d p i , j min ? k 1 i ? 1 ( d p i , j , d p k , j…

MySQL中實現大數據量的快速插入

一、SQL語句優化? 1. ?批量插入代替單條插入? ?單條插入會頻繁觸發事務提交和日志寫入,效率極低。?批量插入通過合并多條數據為一條SQL語句,減少網絡傳輸和SQL解析開銷。 -- 低效寫法:逐條插入 INSERT INTO table (col1, col2) VALUE…

C++23中std::span和std::basic_string_view可平凡復制提案解析

文章目錄 一、引言二、相關概念解釋2.1 平凡復制(Trivially Copyable)2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的應用場景3.1 std::span的應用場景3.2 std::basic_string_view的應用場景 四、P2251R1提案對std::…

廣東省省考備考(第十八天5.23)—言語:語句填空題(聽課后強化訓練)

錯題 解析 橫線出現在文段中間,需結合上下文內容進行分析。文段開篇指出逃離北上廣深的話題時而出現,一些人離開大城市回到小城市。隨后通過轉折詞“但”引出橫線內容,且結合橫線后人才傾向于向更發達的地方流動的內容,橫線處應體…

持續更新 ,GPT-4o 風格提示詞案例大全!附使用方式

本文匯集了各類4o風格提示詞的精選案例,從基礎指令到復雜任務,從創意寫作到專業領域,為您提供全方位的參考和靈感。我們將持續更新這份案例集,確保您始終能夠獲取最新、最有效的提示詞技巧。 讓我們一起探索如何通過精心設計的提…

創建型:建造者模式

目錄 1、核心思想 2、實現方式 2.1 模式結構 2.2 工作流程 2.3 實現案例 2.4 變體:鏈式建造者(常見于多參數對象,無需指揮者) 3、優缺點分析 4、適用場景 1、核心思想 目的:將復雜對象的構建過程與其表示分離…

力扣-長度最小的子數組

1.題目描述 2.題目鏈接 LCR 008. 長度最小的子數組 - 力扣(LeetCode) 3.題目分析 這道題目我們使用的也是雙指針。我們可以定義兩個指針都指向數組第一個元素,然后使用right指針遍歷原數組,計算left指針到right指針之間的所有元…

JAVA開發工具延長方案

親測穩定的延長方案與避坑指南 真的搞不懂了,說點專業的術語竟然成了 QINQUAN。那就直接點,把這個方案帶給需要的開發者。 延長工具直通車 保姆級教程 延長方案https://mp.weixin.qq.com/s/uajM2Y9Vz6TnolzcLur_bw還是讓大家看看,發什么會被…

SpringAI開發SSE傳輸協議的MCP Server

SpringAI 訪問地址:Spring AI ? Spring AI?是一個面向人工智能工程的應用框架,由Spring團隊推出,旨在將AI能力集成到Java應用中。Spring AI的核心是解決AI集成的根本挑戰,即將企業數據和API與AI模型連接起來?。 MCP…

JAVA動態生成類

在java的加載過程一般都是要預先定義java類,然后通過經過加載->連接->初始化三步。連接過程又可分為三步:驗證->準備->解析。初始化的類是不允許修改。但是在日常的工作中有時候需要動態生成類,那第這種情況怎么辦呢? 可以這么處理: 1、先定義一個空的類,僅…

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐

深入解析Java微服務架構:Spring Boot與Spring Cloud的整合實踐 引言 隨著云計算和分布式系統的快速發展,微服務架構已成為現代軟件開發的主流模式。Java作為企業級應用開發的核心語言,結合Spring Boot和Spring Cloud,為開發者提…

03_基礎篇-NumPy(下):深度學習中的常用操作

03_基礎篇-NumPy(下):深度學習中的常用操作 通過上節課的學習,我們已經對NumPy數組有了一定的了解,正所謂實踐出真知,今天我們就以一個圖像分類的項目為例,看看NumPy的在實際項目中都有哪些重要…

時鐘識別項目報告(深度學習、計算機視覺)

深度學習方式 一、模型架構 本模型采用雙任務學習框架,基于經典殘差網絡實現時鐘圖像的小時和分鐘同步識別。 主干網絡 使用預訓練的ResNet18作為特征提取器,移除原分類層(fc層),保留全局平均池化后的512維特征向量。…