1. 程式人生 > 實用技巧 >Django ORM-單表例項重點

Django ORM-單表例項重點

首先建立一app01的專案

django-admin.py startproject app01

接下來在settings.py中找到INSTALLED_APPS這一項,如下:

INSTALLED_APPS =(
    'django.contrib.admin'
    'django.contrib.auth'
    'django.contrib.contenttypes'
    'django.contrib.sessions'
    'django.contrib.messages'
    'django.contrib.staticfiles'
    'app01', 新增初始

接下來,告訴Django使用pymysql模組連線mysql資料庫:

__int__.py檔案
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

建立模型

在專案中的models.py中新增以下類:

models.py檔案

class Book(models.Model):
id= models.AutoField(primary_key=True) id 會自動建立,可以手動寫入
title = models.CharField(max_length=32) 書籍名稱

price = models.DecimalField(max_digits=5,decimal_places=2) 書籍價格
publish = models.CharField(max_length=32) 出版社名稱
pub_date = models.DateField() 出版時間

然後在命令列執行以下命令:

python manage.py migrate 建立表結構

python manage.py makemigrations app01 讓 Django 知道我們在我們的模型有一些變更
python manage.py migrate app01     建立表結構

資料庫新增

規則配置:

app01/urls.py: 檔案程式碼:

from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('add_book/', views.add_book), ]

views.py檔案程式碼 !!!!!!資料庫新增from django.shortcuts import render,HttpResponsefrom app01 import models

def add_book(request):

資料庫新增
方法一
book = models.Book(title="菜鳥教程",price=300,publish="菜鳥出版社",pub_date="2008-8-8")
book.save()
return HttpResponse("<p>資料新增成功!</p>")

方法二
books = models.Book.objects.create(title="如來神掌5", price=200, publish="功夫出版社", pub_date="2010-10-10")

return HttpResponse("<p>資料新增成功!</p>")

查詢
使用 all() 方法來查詢所有內容。
返回的是 QuerySet 型別資料,類似於 list,裡面放的是一個個模型類的物件,可用索引下標取出模型類的物件。
books = models.Book.objects.all()
for i in books:
print(i.title)
QuerySet型別,類似於list,訪問 url 時資料顯示在命令列視窗中。
return HttpResponse("<p>查詢成功!</p>")

1、根據條件查詢
filter() 方法用於查詢符合條件的資料。
返回的是 QuerySet 型別資料,類似於 list,裡面放的是滿足條件的模型類的物件,可用索引下標取出模型類的物件。
pk=3 的意思是主鍵 primary key=3,相當於 id=3。
因為 id 在 pycharm 裡有特殊含義,是看記憶體地址的內建函式 id(),因此用 pk。
books = models.Book.objects.filter(pk=5)

print("//////////////////////////////////////")
books = models.Book.objects.filter(publish='菜鳥出版社', price=300)
print(books ) QuerySet型別,類似於list。
return HttpResponse("<p>查詢成功!</p>")

2、exclude() 方法用於查詢不符合條件的資料。
返回的是 QuerySet 型別資料,類似於 list,裡面放的是不滿足條件的模型類的物件,可用索引下標取出模型類的物件。
books = models.Book.objects.exclude(pk=5)

return HttpResponse("<p>查詢成功!</p>")

3、get() 方法用於查詢符合條件的返回模型類的物件符合條件的物件只能為一個,
如果符合篩選條件的物件超過了一個或者沒有一個都會丟擲錯誤。
books = models.Book.objects.get(pk=5)
books = models.Book.objects.get(pk=18) 報錯,沒有符合條件的物件
books = models.Book.objects.get(price=200) 報錯,符合條件的物件超過一個

return HttpResponse("<p>查詢成功!</p>")

4、order_by() 方法用於對查詢結果進行排序。
返回的是 QuerySet型別資料,類似於list,裡面放的是排序後的模型類的物件,可用索引下標取出模型類的物件。
注意:
a、引數的欄位名要加引號。
b、降序為在欄位前面加個負號 -。
books = models.Book.objects.order_by("price") 查詢所有,按照價格升序排列
books = models.Book.objects.order_by("-price") 查詢所有,按照價格降序排列
return HttpResponse("<p>查詢成功!</p>")

5、reverse() 方法用於對查詢結果進行反轉。
返回的是 QuerySe t型別資料,類似於 list,裡面放的是反轉後的模型類的物件,可用索引下標取出模型類的物件。
按照價格升序排列:降序再反轉 從小到大
books = models.Book.objects.order_by("-price").reverse()
return HttpResponse("<p>查詢成功!</p>")

6、count() 方法用於查詢資料的數量返回的資料是整數。
books = models.Book.objects.count() 查詢所有資料的數量
books = models.Book.objects.filter(price=200).count() 查詢符合條件資料的數量
return HttpResponse("<p>查詢成功!</p>")

7、first() 方法返回第一條資料返回的資料是模型類的物件也可以用索引下標 [0]。
books = models.Book.objects.first() 返回所有資料的第一條資料
return HttpResponse("<p>查詢成功!</p>")

8、last() 方法返回最後一條資料返回的資料是模型類的物件不能用索引下標 [-1],ORM 沒有逆序索引。
books = models.Book.objects.last() 返回所有資料的最後一條資料
return HttpResponse("<p>查詢成功!</p>")

9、exists() 方法用於判斷查詢的結果 QuerySet 列表裡是否有資料。
返回的資料型別是布林,有為 true,沒有為 false。
注意:判斷的資料型別只能為 QuerySet 型別資料,不能為整型和模型類的物件。
books = models.Book.objects.exists()
books = models.Book.objects.count().exists() 報錯,判斷的資料型別只能為QuerySet型別資料,不能為整型
  books = models.Book.objects.first().exists()報錯,判斷的資料型別只能為QuerySet型別資料,不能為模型類物件
  return HttpResponse("<p>查詢成功!</p>")
  10、values() 方法用於查詢部分欄位的資料。
返回的是 QuerySet 型別資料,類似於 list,裡面不是模型類的物件,而是一個可迭代的字典序列,字典裡的鍵是欄位,值是資料。
注意:
引數的欄位名要加引號
想要欄位名和資料用 values
查詢所有的id欄位和price欄位的資料
books = models.Book.objects.values("pk", "price")
print(books[0]["price"]) 得到的是第一條記錄的price欄位的資料
for i in books:
print(i["price"]) 得到所有的價格
return HttpResponse("<p>查詢成功!</p>")

11、values_list() 方法用於查詢部分欄位的資料。
返回的是 QuerySet 型別資料,類似於 list,裡面不是模型類的物件,而是一個個元組,元組裡放的是查詢欄位對應的資料。
注意:
引數的欄位名要加引號
只想要資料用 values_list
查詢所有的price欄位和publish欄位的資料
books = models.Book.objects.values_list("price", "publish")
print(books[0])
return HttpResponse("<p>查詢成功!</p>")

12、distinct() 方法用於對資料進行去重。
返回的是 QuerySet 型別資料。
注意:
對模型類的物件去重沒有意義,因為每個物件都是一個不一樣的存在。
distinct() 一般是聯合 values 或者 values_list 使用。
查詢一共有多少個出版社
books = models.Book.objects.values_list("publish").distinct() 對模型類的物件去重沒有意義,因為每個物件都是一個不一樣的存在。
books = models.Book.objects.distinct()
return HttpResponse("<p>查詢成功!</p>")

13、filter() 方法基於雙下劃線的模糊查詢(exclude 同理)。
注意:filter 中運算子號只能使用等於號 = ,不能使用大於號 > ,小於號 < ,等等其他符號。
__in 用於讀取區間,= 號後面為列表 。
查詢價格為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 在 ... 之間,左閉右閉區間,= 號後面為兩個元素的列表。
查詢價格在200, 300之間的資料
books = models.Book.objects.filter(price__range=[200, 300])

__contains 包含,= 號後面為字串。
查詢包含 菜 的資料
books = models.Book.objects.filter(title__contains="菜")

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

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

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

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

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

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

14、刪除
方式一:使用模型類的 物件.delete()。
返回值:元組,第一個元素為受影響的行數。
注意:
a. Django 刪除資料時,會模仿 SQL約束 ON DELETE CASCADE 的行為,也就是刪除一個物件時也會刪除與它相關聯的外來鍵物件。
b. delete() 方法是 QuerySet 資料型別的方法,但並不適用於 Manager 本身。也就是想要刪除所有資料,不能不寫 all。
books=models.Book.objects.delete()  報錯
books=models.Book.objects.all().delete()   刪除成功
books = models.Book.objects.filter(pk=6).first().delete()
方式二:使用 QuerySet 型別資料.delete()(推薦)
返回值:元組,第一個元素為受影響的行數。
books = models.Book.objects.filter(pk__in=[5]).delete()
return HttpResponse("<p>刪除成功!</p>")

15、修改
方式一:
模型類的物件.屬性 = 更改的屬性值
模型類的物件.save()
返回值:編輯的模型類的物件。
books = models.Book.objects.filter(pk=4).first()
books.price = 400
books.save()
方式二:QuerySet 型別資料.update(欄位名=更改的資料)(推薦)
返回值:整數,受影響的行數
books = models.Book.objects.filter(pk__in=[2,3]).update(price=888)
return HttpResponse("<p>修改成功!</p>")