1. 程式人生 > >Django(ORM單表操作)

Django(ORM單表操作)

預設使用sqllite資料庫

 

建立資料庫

在app models中編寫建立資料庫類

from django.db import models
class Book(models.Model):#表明book django 會自動使用專案名+我們自定義的表名
    # 如果沒有自定義主鍵,django會自動新增一個主鍵,欄位名id 自增
    name =models.CharField(max_length=20) #欄位名name 型別vachar(20)
    price =models.IntegerField  #欄位名是price 型別int
    pub_date =models.DateField()    #
表名 pub_data 型別date(時間戳) author=models.CharField(max_length=32,null=False )#預設可以為空設定null =False則不能為空

常用欄位型別引數

<1> CharField
        #字串欄位, 用於較短的字串.
        #CharField 要求必須有一個引數 maxlength, 用於從資料庫層和Django校驗層限制該欄位所允許的最大字元數.

<2> IntegerField
       #用於儲存一個整數.

<3> FloatField
        
# 一個浮點數. 必須 提供兩個引數: # # 引數 描述 # max_digits 總位數(不包括小數點和符號) # decimal_places 小數位數 # 舉例來說, 要儲存最大值為 999 (小數點後儲存2位),你要這樣定義欄位: # # models.FloatField(..., max_digits=5, decimal_places=2) # 要儲存最大值一百萬(小數點後儲存10位)的話,你要這樣定義:
# # models.FloatField(..., max_digits=19, decimal_places=10) # admin 用一個文字框(<input type="text">)表示該欄位儲存的資料. <4> AutoField # 一個 IntegerField, 新增記錄時它會自動增長. 你通常不需要直接使用這個欄位; # 自定義一個主鍵:my_id=models.AutoField(primary_key=True) # 如果你不指定主鍵的話,系統會自動新增一個主鍵欄位到你的 model. <5> BooleanField # A true/false field. admin 用 checkbox 來表示此類欄位. <6> TextField # 一個容量很大的文字欄位. # admin 用一個 <textarea> (文字區域)表示該欄位資料.(一個多行編輯框). <7> EmailField # 一個帶有檢查Email合法性的 CharField,不接受 maxlength 引數. <8> DateField # 一個日期欄位. 共有下列額外的可選引數: # Argument 描述 # auto_now 當物件被儲存時,自動將該欄位的值設定為當前時間.通常用於表示 "last-modified" 時間戳. # auto_now_add 當物件首次被建立時,自動將該欄位的值設定為當前時間.通常用於表示物件建立時間. #(僅僅在admin中有意義...) <9> DateTimeField # 一個日期時間欄位. 類似 DateField 支援同樣的附加選項. <10> ImageField # 類似 FileField, 不過要校驗上傳物件是否是一個合法圖片.#它有兩個可選引數:height_field和width_field, # 如果提供這兩個引數,則圖片將按提供的高度和寬度規格儲存. <11> FileField # 一個檔案上傳欄位. #要求一個必須有的引數: upload_to, 一個用於儲存上載檔案的本地檔案系統路徑. 這個路徑必須包含 strftime #formatting, #該格式將被上載檔案的 date/time #替換(so that uploaded files don't fill up the given directory). # admin 用一個<input type="file">部件表示該欄位儲存的資料(一個檔案上傳部件) . #注意:在一個 model 中使用 FileField 或 ImageField 需要以下步驟: #(1)在你的 settings 檔案中, 定義一個完整路徑給 MEDIA_ROOT 以便讓 Django在此處儲存上傳檔案. # (出於效能考慮,這些檔案並不儲存到資料庫.) 定義MEDIA_URL 作為該目錄的公共 URL. 要確保該目錄對 # WEB伺服器使用者帳號是可寫的. #(2) 在你的 model 中新增 FileField 或 ImageField, 並確保定義了 upload_to 選項,以告訴 Django # 使用 MEDIA_ROOT 的哪個子目錄儲存上傳檔案.你的資料庫中要儲存的只是檔案的路徑(相對於 MEDIA_ROOT). # 出於習慣你一定很想使用 Django 提供的 get_<#fieldname>_url 函式.舉例來說,如果你的 ImageField # 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 這樣的方式得到影象的絕對路徑. <12> URLField # 用於儲存 URL. 若 verify_exists 引數為 True (預設), 給定的 URL 會預先檢查是否存在( 即URL是否被有效裝入且 # 沒有返回404響應). # admin 用一個 <input type="text"> 文字框表示該欄位儲存的資料(一個單行編輯框) <13> NullBooleanField # 類似 BooleanField, 不過允許 NULL 作為其中一個選項. 推薦使用這個欄位而不要用 BooleanField 加 null=True 選項 # admin 用一個選擇框 <select> (三個可選擇的值: "Unknown", "Yes" 和 "No" ) 來表示這種欄位資料. <14> SlugField # "Slug" 是一個報紙術語. slug 是某個東西的小小標記(短籤), 只包含字母,數字,下劃線和連字元.#它們通常用於URLs # 若你使用 Django 開發版本,你可以指定 maxlength. 若 maxlength 未指定, Django 會使用預設長度: 50. #在 # 以前的 Django 版本,沒有任何辦法改變50 這個長度. # 這暗示了 db_index=True. # 它接受一個額外的引數: prepopulate_from, which is a list of fields from which to auto-#populate # the slug, via JavaScript,in the object's admin form: models.SlugField # (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields. <13> XMLField #一個校驗值是否為合法XML的 TextField,必須提供引數: schema_path, 它是一個用來校驗文字的 RelaxNG schema #的檔案系統路徑. <14> FilePathField # 可選專案為某個特定目錄下的檔名. 支援三個特殊的引數, 其中第一個是必須提供的. # 引數 描述 # path 必需引數. 一個目錄的絕對檔案系統路徑. FilePathField 據此得到可選專案. # Example: "/home/images". # match 可選引數. 一個正則表示式, 作為一個字串, FilePathField 將使用它過濾檔名. # 注意這個正則表示式只會應用到 base filename 而不是 # 路徑全名. Example: "foo.*\.txt^", 將匹配檔案 foo23.txt 卻不匹配 bar.txt 或 foo23.gif. # recursive可選引數.要麼 True 要麼 False. 預設值是 False. 是否包括 path 下面的全部子目錄. # 這三個引數可以同時使用. # match 僅應用於 base filename, 而不是路徑全名. 那麼,這個例子: # FilePathField(path="/home/images", match="foo.*", recursive=True) # ...會匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif <15> IPAddressField # 一個字串形式的 IP 地址, (i.e. "24.124.1.30"). <16># CommaSeparatedIntegerField # 用於存放逗號分隔的整數值. 類似 CharField, 必須要有maxlength引數.

Field中的引數

<1> null : 資料庫中欄位是否可以為空

    <2> blank: django的 Admin 中新增資料時是否可允許空值

    <3> default:設定預設值

    <4> editable:如果為假,admin模式下將不能改寫。預設為真

    <5> primary_key:設定主鍵,如果沒有設定django建立表時會自動加上:
        id = meta.AutoField('ID', primary_key=True)
        primary_key=True implies blank=False, null=False and unique=True. Only one
        primary key is allowed on an object.

    <6> unique:資料唯一

    <7> verbose_name  Admin中欄位的顯示名稱

    <8> validator_list:有效性檢查。非有效產生 django.core.validators.ValidationError 錯誤


    <9> db_column,db_index 如果為真將為此欄位建立索引

    <10>choices:一個用來選擇值的2維元組。第一個值是實際儲存的值,第二個用來方便進行選擇。
                如SEX_CHOICES= (( ‘F’,'Female’),(‘M’,'Male’),)
                gender = models.CharField(max_length=2,choices = SEX_CHOICES)

使用mysql資料庫

修改  settings中的 DATABASES 內容將

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

修改為

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql', 

        'NAME': 'books',    #你的資料庫名稱

        'USER': 'root',   #你的資料庫使用者名稱

        'PASSWORD': '', #你的資料庫密碼

        'HOST': '', #你的資料庫主機,留空預設為localhost

        'PORT': '3306', #你的資料庫埠

    }

}

必須安裝pymysql  pip install pymysql  支援python 連線mysql

在所在專案名下 __init__ 下增加

import pymysql
pymysql.install_as_MySQLdb()

 

python manage.py makemigrations  #根據app下的migrations目錄中的記錄,檢測當前model層程式碼是否發生變化?

python manage.py migrate         #把orm程式碼轉換成sql語句去資料庫執行
python manage.py migrate --fake    #只記錄變化,不提交資料庫操作