Django(三) ORM 數據庫操做

大綱

1、DjangoORM 建立基本類型及生成數據庫表結構 
一、簡介 
二、建立數據庫 表結構 
2、Django ORM基本增刪改查 
一、表數據增刪改查 
二、表結構修改 
3、Django ORM 字段類型 
一、字段類型介紹 
二、字段參數介紹 
三、Django ORM 外鍵操做html

1、DjangoORM 建立基本類型及生成數據庫表結構

一、簡介

ORM:關係對象映射。定義一個類自動生成數據庫的表結構。python

建立數據庫的時候,通常有如下幾種經常使用數據類型:數字、字符串以及時間。mysql

ORM分爲兩種:git

  • DB First 數據庫裏先建立數據庫表結構,根據表結構生成類,根據類操做數據庫
  • Code First 先寫代碼,執行代碼建立數據庫表結構

主流的orm都是code first。django 的orm也是code first,因此學的時候,本質就分爲兩塊:正則表達式

  • 根據類自動建立數據庫表
  • 根據類對數據庫表中的數據進行各類操做

二、建立數據庫 表結構

  • 先寫類:

app下models.py文件:sql

from django.db import models

class UserInfo(models.Model):  # 必須繼承models.Model
    # 不寫則,django默認建立ID列,自增,主鍵
    # 用戶名列,字符串類型,指定長度
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

 

  • 註冊APP

執行命令 python manage.py makemigrations,會提示 No changes detected,這是由於:執行命令時會找全部models,可是django不知道找哪一個,全部須要指定一下。數據庫

settings.py,django

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',            # 這裏添加app
]

 

  • 執行命令生成表結構
python manage.py  makemigrations    # 生成migrations臨時文件
python manage.py  migrate           # 根據migrations直接生成數據庫
 

執行後,從migrations便會產生操做記錄。生成數據庫,默認狀況下用的sqlite3。能夠用navicat等軟件直接打開。緩存

db.sqlite3裏面包含緩存、session、cookie、靜態文件以及後臺管理。像我們建立的表名叫:app01_userinfomarkdown

  • 鏈接mysql數據庫

若是不使用sqlite,使用MySQL數據庫。代碼不用改、命令也不用改,只須要改下配置文件。

# https://docs.djangoproject.com/en/1.10/ref/settings/#databases  官網文檔
# DATABASES = {             # sqlite 默認
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }
DATABASES = {               # mysql
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 

注意:

  • 數據庫名django不能建立,須要本身提早建立

  • Django默認使用MySQLdb模塊連接mysql,但python3如今尚未MySQLdb,因此改成用pymysql去連。在project項目名下的__init__.py裏面

import pymysql
pymysql.install_as_MySQLdb()

 

2、Django ORM基本增刪改查

一、表數據增刪改查

urls.py

 

url(r'^orm/', views.orm),

app01/views.py

from app01 import models  # 導入models模塊
def orm(request):
# 建立數據
    # 第一種方式
    # models.UserInfo.objects.create(username="root",password="123")
    # 第二種方式
    # obj = models.UserInfo(username='fzh', password="iajtag")
    # obj.save()
    # 第三種方式
    # dic = {'username':'lgeng', 'password':'666'}
    # models.UserInfo.objects.create(**dic)

# 查詢數據
    # result = models.UserInfo.objects.all()  # 查詢全部,爲QuerySet類型,可理解成列表
    # result = models.UserInfo.objects.filter(username="lgeng",password="666")  # 列表
    # result = models.UserInfo.objects.filter(username="lgeng").first()  # 對象
    # 條件查詢。filter 至關於where查詢條件,裏面的","會組成and條件
    # for row in result:  # 打印查詢到數據。
    #     print(row.id,row.username,row.password)

    # 查看QuerySet類型具體作了什麼事情,能夠: print(result.query)

# 刪除數據
    # models.UserInfo.objects.all().delete()  # 刪除全部
    # models.UserInfo.objects.filter(id=4).delete()  # 刪除全部

# 更新數據
    # models.UserInfo.objects.all().update(password=8888)
    # models.UserInfo.objects.filter(id=3).update(password=888888)

    return HttpResponse('orm')

二、表結構修改

 

  • 修改列

把最初定義的類中字段 password = models.CharField(max_length=64) 改成 password = models.CharField(max_length=60)。從新執行 python manage.py makemigrationspython manage.py migrate,則數據表結構更改了。若是列內內容超過定義大小,則數據就丟了。

  • 增長一列

類中增長一列,執行命令,會有提示信息,由於默認狀況下是不容許爲空的。這裏提供兩個選項。

  1. 輸入一個值,新增列已存在的行默認加上輸入的內容。
  2. email = models.CharField(max_length=32, null=True),容許爲空

查看錶結構變化時,刷新看不出來,須要從新打開表看效果。

  • 刪除列

類內刪掉相應的字段,執行命令便可。

3、Django ORM 字段類型

一、字段類型介紹

Django ORM 字段類型中,有CharField、EmailField、URLField、GenericIPAddressField等,實際上在數據庫裏都是字符串。不能作檢查語法,作不了驗證。那這個有什麼用呢?

這些是給Django 的 admin 用的。在admin那個網頁上作驗證。若是不用admin,那那些都是字符串,效果都同樣。

自定義自增列models.AutoField(primary_key=True)

一、models.AutoField  自增列 = int(11)
  若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。
2、models.CharField  字符串字段
  必須 max_length 參數
三、models.BooleanField  布爾類型=tinyint(1)
  不能爲空,Blank=True
四、models.ComaSeparatedIntegerField  用逗號分割的數字=varchar
  繼承CharField,因此必須 max_lenght 參數
5、models.DateField  日期類型 date
  對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。
6、models.DateTimeField  日期類型 datetime
  同DateField的參數
七、models.Decimal  十進制小數類型 = decimal
  必須指定整數位max_digits和小數位decimal_places
八、models.EmailField  字符串類型(正則表達式郵箱) =varchar
  對字符串進行正則表達式
九、models.FloatField  浮點類型 = double
10、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  字符串類型(ip4正則表達式)(已棄用,用1三、)
13、models.GenericIPAddressField  字符串類型(ip4和ip6是可選的)
  參數protocol能夠是:both、ipv四、ipv6
  驗證時,會根據設置報錯
14、models.NullBooleanField  容許爲空的布爾類型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  減號、下劃線、字母、數字
18、models.SmallIntegerField  數字
  數據庫中的字段有:tinyint、smallint、int、bigint
1九、models.TextField  字符串=longtext
20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正則表達式
22、models.BinaryField  二進制
23、models.ImageField   圖片
2四、models.FilePathField 文件

 

如上那麼多的字段,可大體分爲 字符串、數字、時間、二進制、自增(primary_key=True)幾類。

二、字段參數介紹

  • 數據庫中的字段參數
null                # 是否能夠爲空
default             # 默認值
primary_key         # 主鍵
db_column           # 列名
db_index            # 索引(db_index=True)
unique              # 惟一索引(unique=True)
unique_for_date     # 只對日期索引
unique_for_month    # 只對月份索引
unique_for_year     # 只對年作索引
auto_now            # 建立時,自動生成時間
auto_now_add        # 更新時,自動更新爲當前時間

 

# 更新時間(auto_now)不支持這種 
obj = UserGroup.objects.filter(id=1).update(caption='CEO')  
obj
= UserGroup.objects.filter(id=1).first() # 自動更新時間須要這樣寫 obj.caption = "CEO" obj.save()

 

  • 如下是隻針對admin的字段參數
choices             # 做用:一、django admin中顯示下拉框;二、避免連表查詢
user_type_choices = (  # 數據庫只存一、二、3,後面的信息存在內存裏。
    (1, '超級用戶'),
    (2, '普通用戶'),
    (3, '普普通用戶'),
)
user_type_id = models.IntegerField(choices=user_type_choices,default=1)
blank              # django admin是否能夠爲空
verbose_name       # django admin顯示字段中文
editable           # django admin是否能夠被編輯
error_messages     # 錯誤信息
    # error_messages={"required":"密碼不能爲空",}  # 注意必須有逗號
help_text          # django admin提示
validators         # django form ,自定義錯誤信息

python manage.py createsuperuser    # 建立 Django 用戶

 

三、Django ORM 外鍵操做

連表關係之一對多,models.ForeignKey(ColorDic)

models.py

  • 表關聯
class UserGroup(models.Model):
    uid = models.AutoField(primary_key=True)
    caption = models.CharField(max_length=32,unique=True)
    ctime = models.DateTimeField(auto_now_add=True, null=True)
    uptime = models.DateTimeField(auto_now=True, null=True)

class UserInfo(models.Model):
    username = models.CharField(max_length=32,blank=True,verbose_name='用戶名')
    password = models.CharField(max_length=60, help_text='pwd')
    email = models.CharField(max_length=60)
    test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '請輸入密碼',})
    # UserInfo表中沒有user_group字段,而是 user_group_id 列 值爲 uid 數字
    user_group = models.ForeignKey("UserGroup",to_field='uid')      # 外鍵關聯 **********

 

  • 數據查詢
user_list = models.Userinfo.objects.all()  # 獲取Userinfo對象
for row in user_list:               # 
    print(row.user_group_id)        # 數據庫裏真實存在的數據
    # user_group:代指UserGroup對象。類UserGroup對象裏封裝了(uid,catption,ctime,uptime)
    print(row.user_group.uid)       # 經過對象獲取uid,和user_group_id同樣
    print(row.user_group.caption)   # 經過對象獲取caption

 

  • 建立數據

UserInfo表建立數據,怎麼寫呢?

models.UserInfo.objects.create(
        username='root1',
        password='123',
        email="asdfasdf",
        test="asdfasdf",
        # 第一種方式:再次查詢數據庫,不推薦
        # user_group = models.UserGroup.objects.filter(id=1).first()
        # 第二種方式:經過 外鍵字段_id
        user_group_id = 1
    )

 


轉載請務必保留此出處:http://www.cnblogs.com/lgeng/articles/7364356.html

 

<!-- EDD  -->

 

 

 

 

 

 

 

 

《版權說明》: 本文轉自 -- http://blog.csdn.net/fgf00/article/details/53678205

相關文章
相關標籤/搜索