7.3.1模型類的定義
from django.db import models
#定義圖書模型類BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名稱')
bpub_date = models.DateField(verbose_name='發佈日期')
bread = models.IntegerField(default=0, verbose_name='閱讀量')
bcomment = models.IntegerField(default=0, verbose_name='評論量')
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_books' # 指明數據庫表名
verbose_name = '圖書' # 在admin站點中顯示的名稱
verbose_name_plural = verbose_name # 顯示的複數名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.btitle
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名稱')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
(1) 數據庫表名
模型類如果未指明表名,Django默認以 小寫app應用名_小寫模型類名 爲數據庫表名。可通過db_table 指明數據庫表名。
(2) 關於主鍵
django會爲表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性爲主鍵列後django不會再創建自動增長的主鍵列。
默認創建的主鍵列屬性爲id,可以使用pk代替,pk全拼爲primary key。
(3) 屬性命名限制
- 不能是python的保留關鍵字以及mysql的關鍵字。
- 不允許使用連續的下劃線,這是由django的查詢方式決定的。
- 定義屬性時需要指定字段類型,通過字段類型的參數指定選項,語法如下:
屬性=models.字段類型(選項)
7.3.2模型類字段數據類型和選項
(1)字段類型
(2)選項
(3)外鍵
在設置外鍵時,需要通過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), )
7.3.3模型類遷移建表
(1)生成遷移文件
python manage.py makemigrations
(2)同步到數據庫中
python manage.py migrate
7.3.4shell工具和mysql日誌
(1)shell工具
python manage.py shell
(2)mysql日誌
將mysql配置文件中的68,69行前面的#去除,然後保存並使用如下命令重啓mysql服務。
sudo tail -f /var/log/mysql/mysql.log 可以實時查看數據庫的日誌內容