Python之路【第十九章】:Django 資料庫物件關係映射,pythondjango

來源:互聯網
上載者:User

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")

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.