1. 程式人生 > 實用技巧 >Django--model-資料庫建立

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