Django--model-資料庫建立
參考連結:https://www.cnblogs.com/maociping/p/5255834.html
http://www.ruanyifeng.com/blog/2019/02/orm-tutorial.html
參考資料:
django基礎http://www.cnblogs.com/wupeiqi/articles/5237704.html
django進階篇http://www.cnblogs.com/wupeiqi/articles/5246483.html
一、建立資料庫模型類
定義模型類
- 模型類被定義在"應用/models.py"檔案中。
- 模型類必須繼承自Model類,位於包django.db.models中。
接下來首先以"圖書-英雄"管理為例進行演示。
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
1.在model裡建立模型類。(繼承models.Model)
from django.db import models # 角色表 class Role(models.Model): role_name = models.CharField(max_length=32, verbose_name='角色') class Meta: db_table = 'tb_role' verbose_name = '角色' verbose_name_plural = verbose_name def __str__(self): return self.role_name # 班級表 class ClassRoom(models.Model): classroom = models.CharField(max_length=20, verbose_name='班級') address = models.CharField(max_length=32, verbose_name='地址') class Meta: db_table = 'tb_clasroom' verbose_name = '班級' verbose_name_plural = verbose_name def __str__(self): return self.classroom # 學生表 class User(models.Model): name = models.CharField(max_length=12, verbose_name='姓名') age = models.IntegerField(verbose_name='年齡') home = models.CharField(max_length=255, null=True, verbose_name='家鄉') #一對多關係 role = models.ManyToManyField(Role, null=True) #多對多關係 class_room = models.ForeignKey(ClassRoom, on_delete=models.CASCADE, null=True) class Meta: db_table = 'tb_user' verbose_name = '使用者' # verbose_name就是在admin中顯示對應的名稱 verbose_name_plural = verbose_name def __str__(self): return self.name
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
Model資料庫連表結構可看部落格:
https://blog.csdn.net/HarryMing/article/details/96847031
https://www.cnblogs.com/chenchao1990/p/5309890.html
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(1) 資料庫表名
模型類如果未指明表名,Django預設以 小寫app應用名_小寫模型類名 為資料庫表名。
可通過tb_table 指明資料庫表名。
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(2) 關於主鍵
django會為表建立自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設定某屬性為主鍵列後django不會再建立自動增長的主鍵列。
預設建立的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(3) 屬性命名限制
-
不能是python的保留關鍵字。
-
不允許使用連續的下劃線,這是由django的查詢方式決定的。
-
定義屬性時需要指定欄位型別,通過欄位型別的引數指定選項,語法如下:
屬性=models.欄位型別(選項)
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(4)欄位型別
一般資料庫中欄位型別大概5種(字串/數字/浮點型/時間型別/布林型別),但Django為了在後臺admin中可以操作資料庫,同時為了限制在admin中對資料庫的無效操作,Model中設定了很多種資料型別。
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
1、models.AutoField 自增列=int(11)
如果沒有的話,預設會生成一個名稱為id的列,如果要顯示的定義一個自增列,必須把該列設定為主鍵(primary_key=True)
2、models.CharField 字串型別欄位 必須加max_length引數
3、models.BooleanField 布林型別欄位=tinyint(1) 不能為空,Blank=True
4、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_places
8、models.EmailField 字串型別(正則表示式郵箱)=varchar 對字串進行正則表示式驗證
9、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正則表示式)
13、models.GenericIPAddressField 字串型別(ip4和ip6是可選的)
引數protocol可以是:both、ipv4、ipv6 驗證時,會根據設定進行報錯
14、models.NullBooleanField 允許為空的布林型別
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 減號、下劃線、字母、數字
18、models.SmallIntegerField 數字
資料庫中的欄位有:tinyint、smallint、int、bigint
19、models.TextField 字串=longtext
20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字串型別,地址正則表示式
22、models.BinaryField 二進位制
23、models.ImageField 圖片
24、models.FilePathField 檔案
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
models.DateTimeField/models.GenericIPAddressField/models.ImageField使用欄位說明
class UserInfo(models.Model):
name = models.CharField(max_length=32)
ctime = models.DateTimeField(auto_now=True) #每當你建立一行資料時,Django就會在該行資料中增加一個ctime欄位
uptime = models.DateTimeField(auto_now_add=True) #當前表任何一行資料有更新時,Django就會自動更新該欄位.
#下面兩項是新增的欄位,注意新增時引數的設定,否則在命令列建立資料庫時報錯,null=True表示在資料庫中該欄位可以為空,default='xxx'表示預設值
email_1 = models.EmailField(max_length=32,null=True)
email_2 = models.EmailField(max_length=32,default='[email protected]')
#新增欄位,blank=True表示admin後臺可以為空
ip = models.GenericIPAddressField(protocol='ipv4',null=True,blank=True) #upload_to='upload'表示使用者上傳資料儲存的位置,這裡需要注意:在資料庫中實際儲存的並不是檔案,而是檔案存放的路徑
img = models.ImageField(null=True,blank=True,upload_to='upload')
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(5) 引數型別
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
1、null=True 資料庫中欄位是否可以為空
2、blank=True django的Admin中新增資料時是否可允許空值
3、primary_key=False 主鍵,對AutoField設定主鍵後,就會代替原來預設的自增id列
4、auto_now和auto_now_add
auto_now 自動建立---無論新增或修改,都是當前操作的時間
auto_now_add 自動建立---永遠是建立時的時間
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices=GENDER_CHOICE)
6、max_length 最大長度
7、default 預設值
8、verbose_name Admin中欄位的顯示名稱
9、name|db_column 資料庫中的欄位名稱
10、unique=True 不允許重複
11、db_index = True 資料庫索引
12、editable=True 在Admin裡是否可編輯
13、error_messages=None 錯誤提示
14、auto_created=False 自動建立
15、help_text 在Admin中提示幫助資訊
16、validators=[] 驗證
17、upload-to 檔案上傳路徑
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
(6) 外來鍵
在設定外來鍵時,需要通過on_delete選項指明主表刪除資料時,對於外來鍵引用表資料如何處理,在django.db.models中包含了可選常量:
-
CASCADE 級聯,刪除主表資料時連通一起刪除外來鍵表中資料
-
PROTECT 保護,通過丟擲ProtectedError異常,來阻止刪除主表中被外來鍵應用的資料
-
SET_NULL 設定為NULL,僅在該欄位null=True允許為null時可用
-
SET_DEFAULT 設定為預設值,僅在該欄位設定了預設值時可用
-
SET() 設定為特定值或者呼叫特定方法,如:
from django.conf import settings from django.contrib.auth import get_user_model from django.db import models def get_sentinel_user(): return get_user_model().objects.get_or_create(username='deleted')[0] class MyModel(models.Model): user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET(get_sentinel_user), )
-
DO_NOTHING 不做任何操作,如果資料庫前置指明級聯性,此選項會丟擲IntegrityError異常
\(~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\)
2 遷移
- 將模型類同步到資料庫中。
(1)生成遷移檔案
python manage.py makemigrations
(2)同步到資料庫中
python manage.py migrate