Django orm基本crud方法大全!!所有操作只看一篇文章就夠了!!

我可是千機傘發表於2020-09-24

話不多說 直接上方法
這裡用到的資料結構為

class something(models.Model):
    id = models.AutoField(primary_key=True) # id 會自動建立,可以手動寫入
    name = models.CharField(max_length=32) # 名稱
    price = models.DecimalField(max_digits=5, decimal_places=2) # 價格
    date = models.DateField() # 時間

1.新增資料

1.1 一般方法

例項化物件來儲存資料,但是需要使用save才會存入資料

from app01 import models 
def add(request):
    thing = models.something(name="鎂鋁",price="300",date="2020-9-24") 
    thing.save()
    return HttpResponse("<p>資料新增成功!</p>")

1.2 ORM(推薦)

通過 ORM 提供的 objects 提供的方法 create 來實現

from app01 import models 
def add(request):
    thing = models.something.objects.create(title="衰哥",price="200",date="2020-9-24") 
    return HttpResponse("<p>資料新增成功!</p>")

2.查詢資料

1.1 all() 查詢所有資料

使用 all() 方法來查詢所有內容。

返回的是 QuerySet 型別資料,類似於 list,裡面放的是一個個模型類的物件,可用索引下標取出模型類的物件。

def all(request):
    thing = models.something.objects.all() 
    print(thing,type(thing)) # QuerySet型別,類似於list,訪問 url 時資料顯示在命令列視窗中。
    for i in thing:
        print(i.name)
    return HttpResponse("<p>查詢成功!</p>")

2.2 filter() 方法用於查詢符合條件的資料

返回的是 QuerySet 型別資料,類似於 list,裡面放的是滿足條件的模型類的物件,可用索引下標取出模型類的物件。

pk=3 的意思是主鍵 primary key=3,相當於 id=3。

因為 id 在 pycharm 裡有特殊含義,是看記憶體地址的內建函式 id(),因此用 pk。

def filter(request):
    thing = models.something.objects.filter(pk=3)
    print(thing)
    thing = models.something.objects.filter(price=200)
    for i in thing:
        print(i.name)
    return HttpResponse("<p>查詢成功!</p>")

2.3 exclude() 方法用於查詢不符合條件的資料。

返回的是 QuerySet 型別資料,類似於 list,裡面放的是不滿足條件的模型類的物件,可用索引下標取出模型類的物件。

def exclude(request):
    thing = models.something.objects.exclude(pk=3)
    print(thing)
    books = models.Book.objects.exclude(price=200)
    for i in thing:
        print(i.name)
    return HttpResponse("<p>查詢成功!</p>")

2.4 get()

方法用於查詢符合條件的返回模型類的物件符合條件的物件只能為一個,如果符合篩選條件的物件大於一個,或沒有一條符合都會報錯

def get(request):
##假設有幾條資料
##ID=5,PRICE=200
##ID=6,PRICE=200

    thing = models.something.objects.get(pk=5)
    thing = models.something.objects.get(pk=18)  # 報錯,沒有符合條件的物件
    thing = models.something.objects.get(price=200)  # 報錯,符合條件的物件超過一個
    for i in thing:
        print(i.name)
    return HttpResponse("<p>查詢成功!</p>")

2.5 order_by() 方法用於對查詢結果進行排序。

返回的是 QuerySet型別資料,類似於list,裡面放的是排序後的模型類的物件,可用索引下標取出模型類的物件。

注意:

a、引數的欄位名要加引號。
b、降序為在欄位前面加個負號 -。

def order_by(request):
    thing = models.something.objects.order_by("price") # 查詢所有,按照價格升序排列 
    thing = models.something.objects.order_by("-price") # 查詢所有,按照價格降序排列
    return HttpResponse("<p>查詢成功!</p>")

2.6 reverse() 方法用於對查詢結果進行反轉。

返回的是 QuerySe t型別資料,類似於 list,裡面放的是反轉後的模型類的物件,可用索引下標取出模型類的物件。

def reverse(request):
    # 按照價格升序排列:降序再反轉
    thing = models.something.objects.order_by("-price").reverse()
    return HttpResponse("<p>查詢成功!</p>")

2.7 count() 方法用於查詢資料的數量返回的資料是整數。

def count(request):
    thing = models.something.objects.count() # 查詢所有資料的數量 
    #高階用法
    thing = models.something.objects.filter(price=200).count() # 查詢符合條件資料的數量
    return HttpResponse("<p>查詢成功!</p>")

2.8 first() 方法返回第一條資料返回的資料是模型類的物件。

def first(request):
    some = models.something.objects.first() # 返回所有資料的第一條資料
    return HttpResponse("<p>查詢成功!</p>")

2.9 last() 方法返回最後一條資料返回的資料是模型類的物件。

def last(request):
    some = models.something.objects.last() # 返回所有資料的最後一條資料
    return HttpResponse("<p>查詢成功!</p>")

2.10 exists() 方法用於判斷查詢的結果 QuerySet 列表裡是否有資料。

返回的資料型別是布林,有為 true,沒有為 false。

注意:判斷的資料型別只能為 QuerySet 型別資料,不能為整型和模型類的物件。

def exists(request):
    thing = models.something.objects.exists()
    # 報錯,判斷的資料型別只能為QuerySet型別資料,不能為整型
    thing = models.something.objects.count().exists()
    # 報錯,判斷的資料型別只能為QuerySet型別資料,不能為模型類物件
    thing = models.something.objects.first().exists()  
    return HttpResponse("<p>查詢成功!</p>")

2.11 values() 方法用於查詢部分欄位的資料。

返回的是 QuerySet 型別資料,類似於 list,裡面不是模型類的物件,而是一個可迭代的字典序列,字典裡的鍵是欄位,值是資料。

注意:

  • 引數的欄位名要加引號
  • 想要欄位名和資料用 values
def values(request):
    # 查詢所有的id欄位和price欄位的資料
    thing = models.something.objects.values("pk","price")
    print(thing[0]["price"],type(thing)) # 得到的是第一條記錄的price欄位的資料
    return HttpResponse("<p>查詢成功!</p>")

2.12 values_list() 方法用於查詢部分欄位的資料。

返回的是 QuerySet 型別資料,類似於 list,裡面不是模型類的物件,而是一個個元組,元組裡放的是查詢欄位對應的資料。

注意:

  • 引數的欄位名要加引號
  • 只想要資料用 values_list
def values_list(request):
    # 查詢所有的price欄位和publish欄位的資料
    thing = models.something.objects.values_list("price","publish")
    print(thing)
    print(thing[0][0],type(thing)) # 得到的是第一條記錄的price欄位的資料
    return HttpResponse("<p>查詢成功!</p>")

2.13 distinct() 方法用於對資料進行去重。

返回的是 QuerySet 型別資料。

注意:

  • 對模型類的物件去重沒有意義,因為每個物件都是一個不一樣的存在。
  • distinct() 一般是聯合 values 或者 values_list 使用。
def distinct(request):
    # 查詢一共有幾種價格
    thing = models.something.objects.values_list("price").distinct() 
    # 對模型類的物件去重沒有意義,因為每個物件都是一個不一樣的存在。
    thing = models.something.objects.distinct()
    return HttpResponse("<p>查詢成功!</p>")

2.14 filter() 方法基於雙下劃線的模糊查詢(exclude 同理)。

注意:filter 中運算子號只能使用等於號 = ,不能使用大於號 > ,小於號 < ,等等其他符號,但是有專門的符號來代替,看下面的程式碼塊!!!!!。

注意:為雙下劃線!!!!
__in
用於讀取區間,= 號後面為區間 。

def filter(request):

    # 查詢價格為200或者300的資料
    books = models.Book.objects.filter(price__in=[200,300])

    #__gt 大於號 ,= 號後面為數字。
    # 查詢價格大於200的資料 
    books = models.Book.objects.filter(price__gt=200)

    #__gte 大於等於,= 號後面為數字。
    # 查詢價格大於等於200的資料 
    books = models.Book.objects.filter(price__gte=200)

    #__lt 小於,=號後面為數字。
    # 查詢價格小於300的資料 
    books=models.Book.objects.filter(price__lt=300)

    #__lte 小於等於,= 號後面為數字。
    # 查詢價格小於等於300的資料 
    books=models.Book.objects.filter(price__lte=300)

    #__range 在 ... 之間,左閉右閉區間,= 號後面為兩個元素的區間。
    books=models.Book.objects.filter(price__range=[200,300])

    #__contains 包含,= 號後面為字串。
    books=models.Book.objects.filter(name__contains="喔喔")

    #__icontains 不區分大小寫的包含,= 號後面為字串。
    books=models.Book.objects.filter(name__icontains="python") # 不區分大小寫

    #__startswith 以指定字元開頭,= 號後面為字串。
    books=models.Book.objects.filter(name__startswith="喔喔")

    #__endswith 以指定字元結尾,= 號後面為字串。
    books=models.Book.objects.filter(name__endswith="喔喔")

    #__year 是 DateField 資料型別的年份,= 號後面為數字。
    books=models.Book.objects.filter(date__year=2008)

    #__month 是DateField 資料型別的月份,= 號後面為數字。
    books=models.Book.objects.filter(date__month=10)

    #__day 是DateField 資料型別的天數,= 號後面為數字。
    books=models.Book.objects.filter(date__day=01)  
    return HttpResponse("<p>查詢成功!</p>"

3.刪除

3.1 delete() 使用模型類刪除

thing=models.something.objects.filter(pk=8).first().delete()

delete() 使用 QuerySet 刪除 (推薦)

thing=models.something.objects.filter(pk__in=[1,2]).delete()

4.修改

4.1 通過拿到模型重新賦值再次執行save方法

thing = models.something.objects.filter(pk=7).first() 
thing.price = 400 
thing.save()

4.2 update 使用QuerySet修改(推薦)

 thing = models.something.objects.filter(pk__in=[7,8]).update(price=888)
    return HttpResponse(thing)
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章