7.3ORM模型類

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 可以實時查看數據庫的日誌內容

發佈了51 篇原創文章 · 獲贊 2 · 訪問量 5939
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章