Django之模型層,單,多表操作(一)
阿新 • • 發佈:2018-12-10
一:資料庫型別
資料庫主要分成兩類,關係型資料庫和非關係型資料庫,具體區別可參照部落格地址,https://blog.csdn.net/u012965373/article/details/51779361。以下個人簡單理解
1:關係型資料庫:
ORM 物件關係型對映。用物件的方式儲存資料庫的資料。
表名 物件名 表字段 物件屬性 表資料 一個例項化物件2:非關係型資料庫
NoSQL = Not Only SQL redis就是一種非關係型資料庫,通過key-value的方式進行儲存。二:Django建立表關係
三:setting資料庫配置
3.1: django在setting預設使用內建sqlite資料庫
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
3.2:django配置mysql資料庫
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 驅動器 'NAME': 'blog', #資料庫名 'USER':'root', #使用者名稱 'PASSWORD':'root1234', #密碼 'HOST':'', # 計算機IP地址,空地址預設本機地址 'PORT':3306, # 埠號 } }
四:Django表關係
4.1:一對一關係:
class UserInfo(AbstractUser): nid = models.AutoField(primary_key=True) telephone=models.CharField(max_length=11,null=True,unique=True) avatar=models.FileField(upload_to='avatar/',default="")#upload_to 代表著檔案上傳到伺服器的位置 預設跟目錄。可以通過設定media blog=models.OneToOneField(to='Bolg',to_field='nid',null=True,on_delete=None) # 建立一對一的關係 def __str__(self): return self.username #部落格表 class Bolg(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(verbose_name='個人部落格標題',max_length=64) site_name=models.CharField(verbose_name='站點名稱',max_length=64) theme=models.CharField(verbose_name='部落格主題',max_length=32) def __str__(self): return self.titleView Code
4.2:一對多
#部落格表 class Bolg(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(verbose_name='個人部落格標題',max_length=64) site_name=models.CharField(verbose_name='站點名稱',max_length=64) theme=models.CharField(verbose_name='部落格主題',max_length=32) def __str__(self): return self.title #文章分類表 class Category(models.Model): nid =models.AutoField(primary_key=True) title=models.CharField(verbose_name='分類名稱',max_length=32) blog=models.ForeignKey(verbose_name='所屬部落格',to='Bolg',to_field='nid',on_delete=None) # 一對多 def __str__(self): return self.titleView Code
4.3:多對多
#標籤表 class Tag(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(verbose_name='標籤名稱',max_length=32) blog = models.ForeignKey(to='Bolg',to_field='nid',on_delete=None) def __str__(self): return self.title #文章表 class Article(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(verbose_name='文章標題',max_length=64) desc=models.CharField(verbose_name='文章摘要',max_length=255) create_data=models.DateTimeField(verbose_name='建立時間',auto_now_add=True) content=models.TextField() user = models.ForeignKey(to='UserInfo',to_field='nid',on_delete=None) category=models.ForeignKey(to='Category',to_field='nid',on_delete=None) # 多對多 tags=models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag')) comment_count=models.IntegerField(default=0) up_count=models.IntegerField(default=0) down_count=models.IntegerField(default=0) def __str__(self): return self.titleView Code
五:model欄位引數
<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引數.