Django之ORM-model模型屬性

来源:https://www.cnblogs.com/yifchan/archive/2019/08/25/python-1-25.html
-Advertisement-
Play Games

Django之ORM-model模型屬性,內容包括項目準備,其中包括a標簽中url的/,Django ORM小結;包括 欄位屬性和選項,其中包括 模型類屬性命名限制,欄位類型,選項等;包括 單表查詢,其中包括 配置MySQL的日誌文件,查詢函數,Q對象,F對象,聚合函數,查詢集等內容。 ...


Django1.8.2中文文檔:Django1.8.2中文文檔 或者 https://yiyibooks.cn/xx/django_182/index.html

項目準備

註釋:關於項目準備,其實和後面的大部分內容都無關,或者說,可以不看,但為了自己和他人更好的體驗,還是放上去。

創建項目

1.創建項目test1000;

2.創建應用booktest;

註冊應用:

INSTALLED_APPS = [
    'booktest.apps.BooktestConfig',
]

 

3.創建資料庫

create database test1000 default charset utf8;

在settings文件下配置資料庫

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'NAME': 'test1000',  # 使用的資料庫的名字,資料庫必須手動創建
        'USER': 'root',  # 鏈接mysql的用戶名
        'PASSWORD': 'root',  # 對應用戶的密碼
        'HOST': '127.0.0.1',  # 指定mysql資料庫所在電腦ip
        'PORT': '3306',  # mysql服務的埠號
    }
}
資料庫配置

 

4.在test1000/__init__.py中加如下內容:
註意:如果沒有pymysql需要先pip install

import pymysql
pymysql.install_as_MySQLdb()

 

5.定義模型類

class BookInfo(models.Model):
    """圖書模型類"""
    # 圖書名稱
    btitle = models.CharField(max_length=20)
    # 出版日期
    bpub_date = models.DateField()
    # 閱讀量
    bread = models.IntegerField(default=0)
    # 評論量
    bcomment = models.IntegerField(default=0)
    # 刪除標記
    isDelete = models.BooleanField(default=False)


class HeroInfo(models.Model):
    """圖書模型類"""
    # 英雄名
    hname = models.CharField(max_length=20)
    # 性別
    hgender = models.BooleanField(default=False)
    # 備註
    hcomment = models.CharField(max_length=200)
    # 關係屬性
    bhbook = models.ForeignKey(to="BookInfo")
    # 刪除標記
    isDelete = models.BooleanField(default=False)
定義圖書和英雄類

生成遷移數據

python manage.py makemigrations
python manage.py migrate

插入數據

INSERT INTO `test1000`.`booktest_bookinfo` (`btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES ('射雕英雄傳', '1980-05-01', 12, 34, 0)
INSERT INTO `test1000`.`booktest_bookinfo` (`btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES ('天龍八部', '1986-07-24', 36, 40, 0)
INSERT INTO `test1000`.`booktest_bookinfo` (`btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES ('笑傲江湖', '1995-12-24', 20, 80, 0)
INSERT INTO `test1000`.`booktest_bookinfo` (`btitle`, `bpub_date`, `bread`, `bcomment`, `isDelete`) VALUES ('雪山飛狐', '1987-11-11', 58, 24, 0)


INSERT INTO `test1000`.`booktest_heroinfo` (`hname`, `hgender`, `hbook_id`, `hcomment`, `isDelete`) VALUES
('郭靖',1,1,'降龍十八掌',0),
('黃蓉',0,1,'打狗棍法',0),
('黃藥師',1,1,'彈指神通',0),
('歐陽鋒',1,1,'蛤蟆功',0),
('梅超風',0,1,'九陰白骨爪',0),
('喬峰',1,2,'降龍十八掌',0),
('段譽',1,2,'六脈神劍',0),
('虛竹',1,2,'天山六陽掌',0),
('王語嫣',0,2,'神仙姐姐',0),
('令狐沖',1,3,'獨孤九劍',0),
('任盈盈',0,3,'彈琴',0),
('岳不群',1,3,'華山劍法',0),
('東方不敗',0,3,'葵花寶典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若蘭',0,4,'黃衣',0),
('程靈素',0,4,'醫術',0),
('袁紫衣',0,4,'六合拳',0);
插入數據

 

6.index頁面顯示書籍

創建模板templates文件夾;
去settings裡面註冊模板文件夾;
創建index頁面;

編寫index頁面,使用ul渲染書籍數據;
給index添加a標簽指向create路由;

<h2>index頁面</h2>
<a href="/create">添加</a>
<ul>
    {% for book in books %}
        <li>{{ book.btitle }}</li>
    {% endfor %}
</ul>
index.html

 

編寫函數,使用模板渲染顯示書籍的頁面
編寫index函數,返回頁面渲染;

def index(request):
    """顯示書籍"""
    # 獲取所有書名
    books = models.BookInfo.objects.all()
    # 使用模板渲染書籍
    return render(request, "booktest/index.html", {"books": books})
index函數

 

進行url匹配;
將路由導向booktest裡面的路由文件;

from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('booktest.urls')),  # 包含booktest應用中的路由文件
]
test1000/url.py

主要路由統一寫在此處,不再重覆寫

# booktest/url.py

from django.conf.urls import url
from booktest import views

urlpatterns = [
    url(r'^index/', views.index),  # 顯示圖書信息
    url(r'^create/', views.create),  # 添加一本書籍
    url(r'^delete(\d+)/', views.delete),  # 刪除一本書籍
    url(r'^areas/$', views.areas),  # 自關聯案例
]

 

7.進行書籍添加處理
編寫create函數,創建bookinfo對象,保存數據,導入redirect,給create函數返回redirect到/index頁面;

def create(request):
    """增加一本書籍"""
    # 1.創建bookinfo對象
    b = models.BookInfo()
    b.btitle = "流星蝴蝶劍"
    b.bpub_date = date(1990, 1, 1)
    # 2.保存進資料庫
    b.save()
    # 3.返回應答,讓瀏覽器再訪問首頁
    # return HttpResponse("ok")
    return redirect('/index')
create函數

給create函數進行路由匹配;

 

8.進行刪除書籍處理
給圖書後面添加刪除鏈接,鏈接應加上書籍id;

<a href="/create">添加</a>
<ul>
    {% for book in books %}
        <li>{{ book.btitle }}--<a href="/delete{{ book.id }}">刪除</a></li>
    {% endfor %}
</ul>

編寫delete函數;

def delete(request, bid):
    """刪除一本書籍"""
    # 1.獲取書籍對象
    book = models.BookInfo.objects.get(id=bid)
    # 2.刪除書籍
    book.delete()
    # 3.重定向
    return redirect('/index')
delete函數

進行路由匹配,註意路由匹配時應接收書籍id;即:

url(r'^delete(\d+)/', views.delete),  # 刪除一本書籍

 

a標簽中url的/

<a href="/create">添加</a>

a標簽記得前面統一加上/;
沒加斜杠的,表示在當前的路由下進行拼接,比如現在在是http://127.0.0.1:8000/index,路由是create,那麼就會拼接成/index/create;
而加了斜杠就不會出現這個問題,斜杠表示http://127.0.0.1:8000/,會直接拼接到根路由下;

 

Django ORM

  • O:(objects)->類和對象。
  • R:(Relation)->關係,關係資料庫中的表格。
  • M:(Mapping)->映射。

ORM框架的功能:

  • a)能夠允許我們通過面向對象的方式來操作資料庫。
  • b)可以根據我們設計的模型類幫我們自動生成資料庫中的表格。
  • c) 通過方便的配置就可以進行資料庫的切換。

 

欄位屬性和選項

模型類屬性命名限制

  • 1)不能是python的保留關鍵字。
  • 2)不允許使用連續的下劃線,這是由django的查詢方式決定的。
  • 3)定義屬性時需要指定欄位類型,通過欄位類型的參數指定選項,語法如下:屬性名=models.欄位類型(選項)

欄位類型

使用時需要引入django.db.models包,欄位類型如下:

類型

描述

AutoField

自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性。
BooleanField 布爾欄位,值為True或False。
NullBooleanField 支持Null、True、False三種值。
CharField(max_length=字元長度)

字元串。參數max_length表示最大字元個數。

TextField 大文本欄位,一般超過4000個字元時使用。
IntegerField 整數。
DecimalField(max_digits=None, decimal_places=None)

十進位浮點數。

參數max_digits表示總位數。參數decimal_places表示小數位數。

FloatField 浮點數。參數同上,精確度不如上面的。
FileField 上傳文件欄位。
ImageField 繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片。
DateField

日期。年月日
參數auto_now表示每次保存對象時,自動設置該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false。
參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,預設為false。
參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。

TimeField 時間,參數同DateField。小時分秒
DateTimeField 日期時間,參數同DateField。年月日時分秒

 

 選項

通過選項實現對欄位的約束,選項如下:

選項名 描述
default 預設值。
primary_key 若為True,則該欄位會成為模型的主鍵欄位,預設值是False,一般作為AutoField的選項使用。
unique 如果為True, 這個欄位在表中必須有唯一值,預設值是False。
db_index 若值為True, 則在表中會為此欄位創建索引,預設值是False。
db_column 欄位的名稱,如果未指定,則使用屬性的名稱。
null 如果為True,表示允許為空,預設值是False。
blank 如果為True,則該欄位允許為空白,預設值是False。

對比:null是資料庫範疇的概念,blank是表單驗證證範疇的。

經驗:當修改模型類之後,如果添加的選項不影響表的結構,則不需要重新做遷移,例如商品的選項中default和blank不影響表的結構;

如果想要更深入的瞭解模型的選型和欄位,建議看官方文檔,百度Django1.8.2.中文文檔即可。

 

單表查詢

配置MySQL的日誌文件

讓其產生mysql.log,即是mysql的日誌文件,裡面記錄了對mysql資料庫的操作記錄。
1).使用下麵的命令打開mysql的配置文件,取消68,69行的註釋,然後保存。

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2).重啟mysql服務,就會產生mysql日誌文件。

sudo service mysql restart

3).打開mysql的日誌文件

/var/log/mysql/mysql.log # mysql日誌文件所在位置

4).使用下麵命令實時查看mysql文件的內容

sudo tail -f /var/log/mysql/mysql.log

 

查詢函數

通過模型類.object屬性可以調用如下函數,實現對模型類對應的數據表的查詢;
註意,查詢集裡面,還可以再次調用一下函數進行處理,即如果你通過filter等函數查詢出來的數據,還可以調用filter等函數進行處理;

函數名 功能 返回值 備註
get() 返回表中滿足條件的一條且只能有一條數據 返回對象;

如果查到多條數據,則拋異常:MultipleObjectsReturned
查詢不到數據,則拋異常:DoesNotExist

all() 返回模型類對應表格中的所有數據。 QuerySet類型 查詢集
filter() 返回滿足條件的數據 QuerySet類型

參數寫查詢條件;

條件格式:模型類屬性名__條件名=值。

exclude 返回不滿足條件的數據 QuerySet類型 參數寫查詢條件;
order_by 對查詢結果進行排序。 QuerySet類型 參數中寫根據哪些欄位進行排序。

 

filter方法示例:

1. 判等 exact。
例:查詢編號為1的圖書。

BookInfo.objects.get(id=1)
BookInfo.objects.get(id__exact=1)

2. 模糊查詢
例:查詢書名包含'傳'的圖書。contains

BookInfo.objects.filter(btitle__contains='')

例:查詢書名以'部'結尾的圖書 endswith 開頭:startswith

BookInfo.objects.filter(btitle__endswith='')

3. 空查詢 isnull
select * from booktest_bookinfo where title is not null;
例:查詢書名不為空的圖書。isnull

BookInfo.objects.filter(btitle__isnull=False)

4. 範圍查詢 in
select * from booktest_bookinfo where id in (1,3,5)
例:查詢編號為1或3或5的圖書。

BookInfo.objects.filter(id__in = [1,3,5])

5. 比較查詢

  • gt(greate than) 大於
  • lt(less than) 小於
  • gte(equal) 大於等於
  • lte 小於等於

例:查詢編號大於3的圖書。

BookInfo.objects.filter(id__gt = 3)

6. 日期查詢
例:查詢1980年發表的圖書。

BookInfo.objects.filter(bpub_date__year=1980)

例:查詢1980年1月1日後發表的圖書。

from datetime import date
BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))

 

exclude方法示例:
例:查詢id不為3的圖書信息。
BookInfo.objects.exclude(id=3)

order_by示例方法:
作用:進行查詢結果進行排序
降序(.all()可以省略)

# 例1:查詢所有圖書信息,按照id從小到大順序進行排序;
BookInfo.objects.all().order_by('id')    # 按照升序排序
# 查詢所有圖書信息,按照id從大到小順序進行排序;
BookInfo.objects.all().order_by('-id') # 按照降序排序
# 把id大於3的圖書信息按閱讀量從大到小排序顯示。
BookInfo.objects.filter(id__gt=3).order_by('-bread') # 把id大於3的圖書信息按閱讀量從大到小排序顯示。

 

Q對象

作用:用於查詢時條件之間的邏輯關係。not and or,可以對Q對象進行&|~操作。

使用之前需要先導入:

from django.db.models import Q

例:查詢id大於3且閱讀量大於30的圖書的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查詢id大於3或者閱讀量大於30的圖書的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查詢id不等於3圖書的信息。

BookInfo.objects.filter(~Q(id=3))

 

F對象

作用:用於類屬性之間的比較。比如要查詢評論量大於閱讀量的文章書籍時就可以使用;

使用之前需要先導入:

from django.db.models import F

例:查詢圖書閱讀量大於評論量圖書信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查詢圖書閱讀量大於2倍評論量圖書信息。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

 

聚合函數

作用:對查詢結果進行聚合操作。

  • sum
  • count
  • avg
  • max
  • min

aggregate:調用這個函數來使用聚合。 返回值是一個字典

使用前需先導入聚合類:

from django.db.models import Sum,Count,Max,Min,Avg

例:查詢所有圖書的數目。

BookInfo.objects.all().aggregate(Count('id'))
{'id__count': 5}

例:查詢所有圖書閱讀量的總和。

BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

 


count函數

返回一個數字
作用:統計滿足條件數據的數目。

例:統計所有圖書的數目。

BookInfo.objects.all().count()
BookInfo.objects.count()
結果:5

例:統計id大於3的所有圖書的數目。

BookInfo.objects.filter(id__gt=3).count()

 

查詢相關函數小結

  • get:返回一條且只能有一條數據,返回值是一個對象, 參數可以寫查詢條件。
  • all:返回模型類對應表的所有數據,返回值是QuerySet。
  • fiter:返回滿足條件的數據,返回值是QuerySet,參數可以寫查詢條件。
  • exclude:返回不滿足條件的數據,返回值是QuerySet,參數可以寫查詢條件。
  • order_ by:對查詢結果進行排序,返回值是QuerySet, 參數中寫排序的欄位。

註意:

  • 1. get, flter,exclude函數中可以寫查詢條件,如果傳多個參數,條件之間代表且的關係。
  • 2. all, fiter, exclude, order. by函數的返回值是QuerySet類的實例對象,叫做查詢集。

 

from diango.db.models import F,Q Sum,Count Avg, Max,Min

  • F對象:用於類屬性之間的比較。
  • Q對象:用於條件之間的邏輯關係。
  • aggregate:進行聚合操作,返回值是一個字典,進行聚合的時候需要先導入聚合類。
  • count:返回結果集中數據的數目,返回值是一個數字。

註意:
對一個QuerySet實例對象,可以繼續調用上面的所有函數。


參考文檔:
http://python.usyiyi.cn/translate/django_182/ref/models/querysets.html

 

查詢集

all, filter, exclude, order_by調用這些函數會產生一個查詢集,QuerySet類對象可以繼續調用上面的所有函數。

查詢集特性

1)惰性查詢:只有在實際使用查詢集中的數據的時候才會發生對資料庫的真正查詢。
2)緩存:當使用的是同一個查詢集時,第一次的時候會發生實際資料庫的查詢,然後把結果緩存起來,之後再使用這個查詢集時,使用的是緩存中的結果。

限制查詢集

可以對一個查詢集進行取下標或者切片操作來限制查詢集的結果。
對一個查詢集進行切片操作會產生一個新的查詢集,下標不允許為負數。

取出查詢集第一條數據的兩種方式:

 

方式  說明
b[0]  如果b[0]不存在,會拋出IndexError異常
b[0:1].get()  如果b[0:1].get()不存在,會拋出DoesNotExist異常。

exists:判斷一個查詢集中是否有數據。True False

books = BookInfo.objects.all()
books1 = books[0:0]
book.exists()
# True
book1.exists()
# False

 


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

-Advertisement-
Play Games
更多相關文章
  • 說起應用分層,大部分人都會認為這個不是很簡單嘛 就`Controller`,`Service`, `Mapper`三層。看起來簡單,很多人其實並沒有把他們職責劃分開,在很多代碼中,`Controller`做的邏輯比`Service`還多,`Service`往往當成透傳了,這其實是很多人開發代碼都沒有... ...
  • 新聞 "高效的F ,提示與技巧" "Fable 社區資源" "Visual Studio提示與技巧:為.NET增加生產力" "無風險地嘗試Compositional IT的培訓包——如果沒有增加任何價值,可以得到完全退款" ".NET Core與systemd" "在Visual Studio中通過 ...
  • 2019/08/25 1、eclipse 程式安裝 https://www.cnblogs.com/tianxxl/p/10043390.html 網盤路徑:JAVA學習文件 2、資源文件 https://www.cnblogs.com/litexy/p/9746755.html ...
  • 痛苦而艱難 才寫出這一點點,這是個登陸測試 main 抓包類login_tst 剛學測試和python 寫的一般 讓各位見笑了 ...
  • 1.位元組流: FileInputStream(位元組輸入流) 特有方法: FileInputStream fis = new FileInputStream("temp.txt"); 1.int num = fis.available();//返迴文件的位元組總個數 2.fis.read()//返回in ...
  • 在上一篇文章《SpringBoot進階教程(六十)intellij idea project下建多個module(上)》中,我們已經介紹了在intellij idea中創建project之後再分化多個module,今天再大致介紹介紹各個module之間詳細工作的細分。 如果是不考慮細分多個modul... ...
  • 1.Writer:字元輸出流 Writer: FileWriter BufferedWriter:newLine()//換行 簡單步驟: FileWriter fw=new FileWriter("e:\\t.txt"); fw.write("hello");//寫入到內部的緩衝區,是一個位元組數組 ...
  • 1.Map:獨立的介面 HashMap:使用的是哈希表,保證鍵不重覆依據: int hashCode() boolean equals(Object obj) TreeMap:使用的是二叉樹,根據鍵排序,Comparable<E> int compareTo(E e) Comparator<E> i ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...