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
結束!!!