Python之路【第十九章】:Django 資料庫物件關係映射,pythondjango
Django ORM基本配置
到目前為止,當我們的程式涉及到資料庫相關操作時,我們一般都會這麼搞:
- 建立資料庫,設計表結構和欄位
- 使用 MySQLdb 來串連資料庫,並編寫資料訪問層代碼
- 商務邏輯層去調用資料訪問層執行資料庫操作
django為使用一種新的方式,即:關聯性物件映射(Object Relational Mapping,簡稱ORM),django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動產生資料庫表
1、修改project資料庫配置(程式主目錄下的settings.py檔案)
預設串連資料庫為本地檔案sqlite3:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}
更換為指定的mysql資料庫:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'zyweb', #資料庫名 'USER': 'root', #帳號 'PASSWORD': 'zyw@123', #密碼 'HOST': '192.168.28.129', #mysql資料庫IP 'PORT': '3306', #對端連接埠 }}
2、建立定義資料庫表結構檔案(對應app目錄下的models.py檔案)
產生一個簡單的資料庫表:
from django.db import models# Create your models here.class UserInfo(models.Model): # 建立的表名名稱為cmdb_userinfo # 資料庫預設建立id列 自增 主鍵 # 使用者名稱列 字串類型 字元長度 username = models.CharField(max_length=32) passwd = models.CharField(max_length=64)
把對應的app名稱加入到settings.py檔案配置裡:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cmdb', # 系統會載入cmdb下的model.py檔案]
3、產生資料庫表
執行下面命令:
python manage.py makemigrationspython manage.py migrate # 產生資料表
查看資料庫表詳情:
mysql> desc cmdb_userinfo;+----------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+----------------+| id | int(11) | NO | PRI | NULL | auto_increment || username | varchar(32) | NO | | NULL | || passwd | varchar(64) | NO | | NULL | |+----------+-------------+------+-----+---------+----------------+3 rows in set (0.01 sec)
注意:Django預設用的MysqlDB模組串連資料庫,但在python3.x裡面還沒有這個模組,所有需要把串連資料庫的模組改成pymsyql,修改project目錄下的init.py檔案
import pymysqlpymysql.install_as_MySQLdb()
4、資料庫欄位和欄位參數
1、models.AutoField 自增列 = int(11) 如果沒有的話,預設會產生一個名稱為 id 的列,如果要顯示的自訂一個自增列,必須將給列設定為主鍵 primary_key=True。2、models.CharField 字串欄位 必須 max_length 參數3、models.BooleanField 布爾類型=tinyint(1) 不可為空,Blank=True4、models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 繼承CharField,所以必須 max_lenght 參數5、models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,之後的更新不再改變。6、models.DateTimeField 日期類型 datetime 同DateField的參數7、models.Decimal 十進位小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places8、models.EmailField 字串類型(Regex郵箱) =varchar 對字串進行Regex9、models.FloatField 浮點類型 = double10、models.IntegerField 整形11、models.BigIntegerField 長整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), }12、!models.IPAddressField 字串類型(ip4Regex)不再使用13、models.GenericIPAddressField 字串類型(ip4和ip6是可選的) 參數protocol可以是:both、ipv4、ipv6 驗證時,會根據設定報錯14、models.NullBooleanField 允許為空白的布爾類型15、models.PositiveIntegerFiel 正Integer16、models.PositiveSmallIntegerField 正smallInteger17、models.SlugField 減號、底線、字母、數字18、models.SmallIntegerField 數字 資料庫中的欄位有:tinyint、smallint、int、bigint19、models.TextField 字串=longtext20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]21、models.URLField 字串,地址Regex22、models.BinaryField 二進位23、models.ImageField 圖片24、models.FilePathField 檔案所有欄位...
null -> db是否可以為空白default -> 預設值primary_key -> 主鍵db_column -> 列名db_index -> 索引unique -> 唯一索引unique_for_date ->unique_for_monthunique_for_yearauto_now -> 建立時,自動產生時間auto_now_add -> 更新時,自動更新為目前時間choices -> django admin中顯示下拉框,避免連表查詢blank -> django admin是否可以為空白verbose_name -> django admin顯示欄位中文editable -> django admin是否可以被編輯error_messages -> 錯誤資訊欠help_text -> django admin提示validators -> djangoform, 自訂錯誤資訊(欠)
所有欄位參數...
Django 資料庫操作
1、增加資料
第一種方式(最常用):
from cmdb import modelsdef ormadd(request): models.UserInfo.objects.create(username="James",passwd="8888") return HttpResponse("ormadd")
第一種方式的另一種寫法:
from cmdb import modelsdef ormadd(request): dicts = {'username':"James",'passwd':"8888"} models.UserInfo.objects.create(**dicts) return HttpResponse("ormadd")
第二種方式:
from cmdb import modelsdef ormadd(request): obj = models.UserInfo(username='root',passwd='123') obj.save() return HttpResponse("ormadd")
2、查詢資料
查詢所有:
from cmdb import modelsdef ormselect(request): result = models.UserInfo.objects.all() print(result) # QuerySet類型 列表裡每個元素都是一個obj對象 # <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> for row in result: print(row.id,row.username,row.passwd) # 1 James 8888 # 2 root 123 # 3 James 8888 return HttpResponse("ormselect")
尋找指定欄位:
from cmdb import modelsdef ormselect(request): result = models.UserInfo.objects.filter(username='root') # filter()裡可以用,分開 表示and if result: for row in result: print(row.id,row.username,row.passwd) # 2 root 123 return HttpResponse("ormselect")
擷取查詢第一條資料和統計匹配個數:
from cmdb import modelsdef ormselect(request): obj = models.UserInfo.objects.filter(username='root').filter() # 擷取匹配的第一條欄位 c = models.UserInfo.objects.filter(username='root').count() # 擷取匹配的欄位個數 return HttpResponse("ormselect")
3、刪除資料
刪除指定欄位:
from cmdb import modelsdef ormdel(request): models.UserInfo.objects.filter(id=3).delete() return HttpResponse("ormdel")
4、更新資料
更新指定欄位:
from cmdb import modelsdef ormupdate(request): models.UserInfo.objects.filter(id=2).update(passwd='99999') return HttpResponse("ormupdate")
5、單表外部索引鍵關聯
資料庫表結構:
from django.db import models# Create your models here.class UserInfo(models.Model): # 建立的表名名稱為cmdb_userinfo username = models.CharField(max_length=32) passwd = models.CharField(max_length=64) # 關聯外鍵 產生欄位名為user_group_id user_group = models.ForeignKey("UserGroup",to_field='uid',default=1) #關聯usergroup表的uid欄位預設為1class UserGroup(models.Model): # 建立的表名名稱為cmdb_usergroup uid = models.AutoField(primary_key=True) #主鍵 自增 caption = models.CharField(max_length=32,unique=True) #唯一索引 ctime = models.DateField(auto_now_add=True,null=True) #建立時產生時間 uptime = models.DateField(auto_now=True,null=True) #更新是自動更新時間
外部索引鍵關聯表操作:
from cmdb import modelsdef ormadd(request): models.UserInfo.objects.create(username="James",passwd="8888") return HttpResponse("ormadd")def ormgroup(request): models.UserGroup.objects.create(caption="CEO") return HttpResponse("ormgroup")def userinfo(request): obj = models.UserInfo.objects.all().first() # user_group_id 指定的是userinfo表裡存的id號 print(obj.id,obj.username,obj.user_group_id) # 1 James 1 # user_group 指定的是使用者組obj對象 print(obj.user_group.uid,obj.user_group.caption) # 1 CEO return HttpResponse("userinfo")