Django開發之數據庫表的關聯(Django模型)


前言:目前後臺服務器開發主要使用還是關係型數據庫,關係型數據庫主要分爲一對一、一對多、多對多的關係。


1.字段類型

使用時需要引入django.db.models包,字段類型如下:

  • AutoField:自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名爲id的自動增長屬性。
  • BooleanField:布爾字段,值爲True或False。
  • NullBooleanField:支持Null、True、False三種值。
  • CharField(max_length=字符長度):字符串。參數max_length表示最大字符個數。
  • TextField:大文本字段,一般超過4000個字符時使用。
  • IntegerField:整數。
  • DecimalField(max_digits=None, decimal_places=None):十進制浮點數。參數max_digits表示總位數。參數decimal_places表示小數位數。
  • FloatField:浮點數。
  • DateField[auto_now=False, auto_now_add=False]):日期。
    參數auto_now表示每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,默認爲false。參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認爲false。參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。
  • TimeField:時間,參數同DateField。
  • DateTimeField:日期時間,參數同DateField。
  • FileField:上傳文件字段。
  • ImageField:繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片。

注意:

  • null:如果爲True,表示允許爲空,默認值是False。
  • blank:如果爲True,則該字段允許爲空白,默認值是False。對比:null是數據庫範疇的概念,blank是表單驗證範疇的。
  • db_column:字段的名稱,如果未指定,則使用屬性的名稱。
  • db_index:若值爲True, 則在表中會爲此字段創建索引,默認值是False。
  • default:默認值。
  • primary_key:若爲True,則該字段會成爲模型的主鍵字段,默認值是False,一般作爲AutoField的選項使用。
  • unique:如果爲True, 這個字段在表中必須有唯一值,默認值是False。

2.on_delete參數

  • CASCADE:刪除主鍵記錄和 相應的外鍵表記錄。
  • PROTECT:禁止刪除記錄。
  • SET_NULL:刪除主鍵記錄,並且將外鍵記錄中外鍵字段的值置爲null。 當然前提是外鍵字段要設置爲值允許是null。

3.一對一關係

比如一個學生有自己的姓名和學號信息,但是也有他的考試成績信息,我們就可以設計成一對一的關係,當然一對一的表設計通常可以合成一個表。
代碼:

from django.db import models

class Stdudent(models.Model):
    name = models.CharField(max_length=200)
    number = models.CharField(max_length=200)
    addre = models.CharField(max_length=200)
    class Meta:
        db_table = 'student'
        verbose_name = '學生'
        verbose_name_plural = verbose_name

class Grade(models.Model):
    math = models.FloatField()
    chinese = models.FloatField()
    student = models.OneToOneField(Stdudent, on_delete=models.PROTECT) #一對一

    class Meta:
        db_table = 'grade'
        verbose_name = '成績'
        verbose_name_plural = verbose_name

4.一對多關係

從一對一的那個例子中,我們就能發現一個問題,如果一個學生有多次考試呢,比如一模成績,二模成績,所以就引出了一對多的關係,下面我們改進一對一的代碼,變成一對多的代碼。

from django.db import models

class Stdudent(models.Model):
    name = models.CharField(max_length=200)
    number = models.CharField(max_length=200)
    addre = models.CharField(max_length=200)
    class Meta:
        db_table = 'student'
        verbose_name = '學生'
        verbose_name_plural = verbose_name

class Grade(models.Model):
    math = models.FloatField()
    chinese = models.FloatField()
    index = models.IntegerField() #新增字段,表示第幾次的考試
    # student = models.OneToOneField(Stdudent, on_delete=models.PROTECT)  # 一對一
    student = models.ForeignKey(Stdudent, on_delete=models.PROTECT) #一對多

    class Meta:
        db_table = 'grade'
        verbose_name = '成績'
        verbose_name_plural = verbose_name

5.多對多關係

既然一個學生會有多次模擬考試,我們是不是還可以想到一個學生對應多門課程,然後一門課程對應多個學生,所以這就是多對多的關係,看下面代碼:

from django.db import models

class Course(models.Model):
    cname = models.CharField(max_length=200) #課程名字
    class Meta:
        db_table = 'course'
        verbose_name = '課程名字'
        verbose_name_plural = verbose_name

class Stdudent(models.Model):
    name = models.CharField(max_length=200)
    number = models.CharField(max_length=200)
    addre = models.CharField(max_length=200)
    course = models.ManyToManyField(Course) #多對多
    class Meta:
        db_table = 'student'
        verbose_name = '學生'
        verbose_name_plural = verbose_name

結束!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章