當(dāng)你在django中配置完數(shù)據(jù)庫時,肯定要在models.py文件中創(chuàng)建數(shù)據(jù)庫表的結(jié)構(gòu)。當(dāng)然,建單表肯定是好建的,關(guān)鍵是數(shù)據(jù)為一對多或多對多的時候,建立的表就麻煩些。
外鍵的調(diào)用
比如我要建個book表和一個Publisher表,我們知道,一本書只能由一個出版社出版,而一個出版社可以出多本書,所以書和出版社之間存在一對多的關(guān)系。所以我可以這樣寫
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30, verbose_name="名稱")
address = models.CharField("地址", max_length=50)
city = models.CharField('城市',max_length=60)
class Book(models.Model):
title = models.CharField(max_length=100)
# django 2.0后,添加外鍵時要再加一個on_delete參數(shù)才可以,
# on_delete有多少個選項呢:
#CASCADE:這就是默認(rèn)的選項,級聯(lián)刪除,你無需顯性指定它。
#PROTECT: 保護(hù)模式,如果采用該選項,刪除的時候,會拋出ProtectedError錯誤。
#SET_NULL: 置空模式,刪除的時候,外鍵字段被設(shè)置為空,前提就是blank=True, null=True,定義該字段的時候,允許為空。
#SET_DEFAULT: 置默認(rèn)值,刪除的時候,外鍵字段設(shè)置為默認(rèn)值,所以定義外鍵的時候注意加上一個默認(rèn)值。
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
因為一個出版社對應(yīng)多本書,所以書是多的那一方,所以要把外鍵放到書的那個表中。
多對多建立數(shù)據(jù)表
當(dāng)我再添加一個作者表的時候,因為一本書可以有多個作者,而一個作者可以寫多本書,所以書和作者之間存在多對多的關(guān)系。我可以這樣寫
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
# 這個多對多關(guān)系寫到哪個表中都可以
authors = models.ManyToManyField(Author)
這樣,基本的一對多和多對多數(shù)據(jù)表就創(chuàng)建完成了。