Django筆記三之使用model對資料庫進行增刪改查

来源:https://www.cnblogs.com/hunterxiong/archive/2023/03/19/17234822.html
-Advertisement-
Play Games

大家好,我是3y啊。 大概不知道從什麼時候,「微服務」「分散式」這兩個詞又再次頻繁出現在我的視線里。 「微服務」「分散式」在我剛畢業的時候還是比較關註的,那時候還入門了一把SpringCloud,寫了一篇很長的文章,還是很頂的,有不少的大號都給我轉載了,在知乎又獲得了很多的贊。 那時候覺得懂「分散式 ...


本篇筆記目錄索引如下:

  1. model 準備

1、model 準備

在上一篇筆記中,我們新建了一個 application,增加了幾個model 同步到了資料庫,這次我們新建一個名為 blog 的application,同步數據結構。
大概分為以下幾步:

  • python3 manage.py startapp blog
  • 將 'blog.apps.BlogConfig’, 寫入 settings.py INSTALLED_APPS
  • 更新 blog/models.py
  • python3 manage.py makemigrations blog
  • python3 manage.py migrate blog

具體執行 migrate 的操作步驟,可以參見上一篇筆記。

blog/models.py 的具體內容如下:

# blog/models.py
from django.db import models


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name


class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name


class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField()
    number_of_pingbacks = models.IntegerField()
    rating = models.IntegerField()


    def __str__(self):
        return self.headline

2、增

有以下幾種方法(以下操作皆在 python3 manage.py shell 環境中進行):

實例化,然後save() 保存

from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()

當執行 save() 操作之後,數據就會創建到資料庫,因為主鍵 id 為自動增長的,所以id會自動賦值。

當然也可以先實例化一個空的 Blog,然後再賦值:

from blog.models import Blog
b = Blog()
b.name = 'hunter'
b.tagline = 'tag lines'
b.save()

save 之後,如果需要修改 name 的值,可以直接進行修改:

b.name = ‘python’
b.save()

使用 create() 方法創建

from blog.models import Blog
b = Blog.objects.create(name='hunter', tagline='tagline')

調用 create() 方法,會返回這條數據保存後的對象。

批量創建
如果要批量創建數據,用上面的方法大概的就是在一個迴圈里,挨個去實例化一個 Blog,然後執行 save() 操作。

但Django 提供了一個 bulk_create() 的方法,可以提高這個效率,使用示例如下:

from blog.models import Blog

blog_1 = Blog(name='hunter1', tagline='tagline1')
blog_2 = Blog(name='hunter2', tagline='tagline2')
blog_obj_list = [blog_1, blog_2]

Blog.objects.bulk(blog_obj_list)

3、查

查詢的語法有查詢之後返回 QuerySet 的查詢,比如 filter(),exclude()
也有 返回單個 object 的查詢,比如 get()

對於 QuerySet,這個我們可以簡單理解為是多個 object 實例形成的列表,但是這個列表是Django的一種特有的形式,具有能進行其他條件篩選的功能。

接下來簡單介紹一下查詢的功能:
filter(),過濾篩選,返回的是符合條件的數據
比如我們要搜索 Entry 表裡,name 的值為 hunter 的數據,使用如下:

Entry.objects.filter(name='hunter')

exclude(),排除篩選,返回的是不符合條件的數據
比如我們要搜索 Entry 表裡,name 的值不為 hunter 的數據:

Entry.objects.exclude(name='hunter')

鏈式查詢:
Django 支持 鏈式查詢,可以多個 filter 或者 exclude 條件累加,取的是 AND 的邏輯:

Entry.objects.filter(name='hunter').exclude(name='paul').filter(id=1)

懶載入:
Django 的查詢有一個機制叫做懶載入,意思是只有當你真正需要去取數據的時候
系統才會去資料庫獲取數據,官方例子如下:

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)

上述語句雖然看起來查詢了三次資料庫,但實際上只有最後 print(q) 的時候才去訪問了資料庫。

get()
前面講的 filter 和 exclude 返回的都是 QuerySet,簡單來說就是多個 object 形成的列表,而 get() 操作返回的直接是一條符合條件的 object。
比如:

blog = Blog.objects.get(id=1)

註意: get() 方法需要慎用,因為查詢的條件在資料庫里,有多條或者一條都沒有的時候系統會報錯。
get() 的查詢一般僅用在我們能夠確定 在資料庫里有且僅有一條數據情況下。

對QuerySe進行切片
用 filter 對數據進行操作的時候,如果需要對數據的返回數量進行限制,需要用到 python 里的切片。
PS:數量的返回限制對應於 mysql 里的 limit 用法。
比如:

blog_list = Blog.objects.all()[1:5]

但是和 python 里的切片不一樣的時候,Django 的查詢不支持 負數查詢,比如下麵的操作是不被允許的:

Blog.objects.all()[-1]  # error
Blog.objects.all()[-1: 3]  # error

欄位條件查找:
在我們使用 mysql 的時候 where 後面會跟一些查詢的限制條件,在Django 里用 雙下劃線來實現
比如 id 的值大於 5

Model.objects.filter(id__gt=5)

大於:gt
大於等於:gte
小於:lt
小於等於:lte
包含:in
是否為 null :isnull

精確查找:
精確查找使用 exact,一般查詢的時候 後面不加上面的欄位條件,都屬於精確查找,不過預設是將 exact 欄位省略。
比如,下麵兩條代碼是一致的:

Blog.objects.get(id__exact=14)
Blog.objects.get(id=14) 

查詢外鍵關聯數據
比如 Entry 這個 model 的外鍵是 Blog,我們想通過 查找 Blog 的 name 欄位為 Hunter 的Entry 數據:

Entry.objects.filter(blog__name='Hunter')

如果你想反向搜索也是可以的,將 model 名稱小寫即可:

Blog.objects.filter(entry__headline='abc')

計算查找
在Django 中引用欄位來進行比較,比如我們想實現如下功能:

select * from blog_entry where number_of_comments > number_of_pingbacks;

可以使用Django 中的 F,它的作用是 取值,取出其中的欄位值,那麼上述例子可以用 Django來實現可以是:

from django.db.models import F
Entry.objects.filter(number_of_comments__gt=F(“number_of_pinbbacks"))

還可以在使用中對 F() 進行一系列的操作:

Entry.objects.filter(number_of_comments__gt=F('number_of_pingbacks') * 2)
Entry.objects.filter(rating__lt=F('number_of_comments') + F('number_of_pingbacks'))

pk 使用方法
pk 意思是 primary key ,主鍵,可以直接使用 pk 來搜索,但在項目中一般是使用 id 作為主鍵,所以一般是等價於id的用法:

Blog.objects.filter(pk__gt=11)

Q 查詢:
我們知道可以使用 filter 來進行 鏈式查詢,那個邏輯是一個且的邏輯,那麼 或 的邏輯應該如何處理呢
我們可以使用Q() 來實現

我們可以使用 Q() 來將一個個的條件 串起來,比如,我們想篩選 Blog 中 id= 3 或者 id = 4 的數據可以使用如下:

Blog.objects.filter(Q(id=3) | Q(id=4))

也可以實現 且 的功能Q() & Q()
取反:~Q()

4、刪

如果要刪除 objects,有兩種方法,一種先獲取 object,然後 delete()

blog = Blog.objects.get(id=1)
blog.delete()

或者通過 filter 來 批量刪除:

Blog.objects.filter(id__gte=10).delete()

註意:如果有外鍵關聯了 Blog,且 on_delete關係設置為 models.CASCADE,
那麼刪除相應的 Blog 的時候,對應的 關聯的 Entry 數據也會被刪除

5、改

批量更新:

Blog.objects.filter(id__gte=200).update(name='hunter')

單個更新:

blog = Blog.objects.get(id=1)
blog.name = ‘hunter’
blog.save()

以上就是我們這一篇筆記的全部內容,下一篇筆記將詳細介紹Django model里的 各個欄位類型以及欄位屬性值。

本文首發於本人微信公眾號:Django筆記。

原文鏈接:Django筆記三之使用model對資料庫進行增刪改查

如果想獲取更多相關文章,可掃碼關註閱讀:
在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS概念 css的使用是讓網頁具有統一美觀的頁面,css層疊樣式表,簡稱樣式表,文件尾碼名.css css的規則由兩部分構成:選擇器以及一條或者多條聲明 選擇器:通常是需要改變的HTML元素 聲明:由一個屬性和一個值組成,每個屬性有一個值,屬性和值使用類似key:value的形式(如下方h1就是選 ...
  • 多個路由通過路由器進行管理。 前端路由的概念和原理 (編程中的)路由(router)就是一組key-value對應關係,分為:後端路由和前端路由 後端路由指的是:請求方式、請求地址和function處理函數之間的對應關係 在SPA程式中,所有組件的展示和切換都在這唯一的一個頁面內完成,此時,不同組件 ...
  • 定義 如果希望動態給某個類添加一些屬性或者方法,但是你又不希望這個類派生的對象受到影響,那麼裝飾器模式就可以給你帶來這樣的體驗。 它的定義就是在不改變原對象的基礎上,通過對其進行包裝拓展,使得原有對象可以動態具有更多功能,從而滿足用戶的更複雜需求。 舉個例子,一部手機,你可以買各種花里胡哨的手機殼等 ...
  • 長期以來,我們一直聽說物聯網(IoT)將通過將日常設備連接到互聯網來改變我們的生活和工作方式。雖然物聯網的許多承諾似乎總是 "即將到來",但物聯網設備的激增已經創造了大量的數據,需要實時處理、存儲和分析。我已經說了很多年--實際上已經超過十年了--如果你的物聯網數據不及時、不准確、不具有可操作性,那 ...
  • 這篇文章主要描述硬體同步原語,它是由電腦硬體提供的一組原子操作。 我們常見的原語操作有CAS和FAA兩種。在某些情景下,我們可以使用它來替代鎖,從而更加安全高效的操作數據。 ...
  • 這篇文章主要關註分散式鎖,包括加鎖和解鎖的過程,鎖的用法,加鎖帶來的代價,對性能的影響以及如何避免死鎖。 ...
  • 1. 性能優化是圍繞工具展開的 1.1. 最重要的工具大都是Java開發工具包(JDK)自帶的 1.2. 查看應用程式性能時,首先應該考察的就是CPU時間 2. 操作系統工具 2.1. Unix系統 2.1.1. sar(System Accounting Report)及其組成工具 2.1.2.  ...
  • Java 比較(==, equals) 一、= = ==:比較兩個對象的引用是否是同一個地址 二、equals object中equals方法調用的就是==,可以在其他類中重寫該方法。 三、為什麼要重寫equals要重寫hashcode方法 因為散列集合插入對象時會進行判斷,先調用hashcode, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...