Django是通過Model來操作數據庫的,無論我們使用的是mysql還是sqlite3,Django都會幫我們自動生成相應數據庫類型的sql語句,所以我們不需要關注sql語句和類型,Django會幫我們自動生成,我們只需要會寫model就可以了。
Django根據代碼中編寫的類來自動生成數據庫表。我們寫的類表示數據庫的表。
基本原則:
- 每個模型在Django中表現為一個Python類
- 每個模型都是繼承自django.db.models.Model,都是django.db.models.Model的子類
- 模型里的每個類都代表着數據庫中的一個表
- 模型的每個字段(屬性)都代表着數據庫表中的某一列
- Django會自動生成訪問數據庫的API
下面我們以博客項目為例,經過分析,完成博客項目我們需要存儲六種數據:文章分類、文章、文章標簽、幻燈圖、推薦位、友情鏈接。每種數據一個表。
from django.db import models from django.contrib.auth.models import User #導入Django自帶用戶模塊 # 文章分類 class Category(models.Model): name = models.CharField('博客分類', max_length=100) index = models.IntegerField(default=999, verbose_name='分類排序') class Meta: verbose_name = '博客分類' verbose_name_plural = verbose_name def __str__(self): return self.name #文章標簽 class Tag(models.Model): name = models.CharField('文章標簽',max_length=100) class Meta: verbose_name = '文章標簽' verbose_name_plural = verbose_name def __str__(self): return self.name #推薦位 class Tui(models.Model): name = models.CharField('推薦位',max_length=100) class Meta: verbose_name = '推薦位' verbose_name_plural = verbose_name def __str__(self): return self.name #文章 class Article(models.Model): title = models.CharField('標題', max_length=70) excerpt = models.TextField('摘要', max_length=200, blank=True) category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分類', blank=True, null=True) #使用外鍵關聯分類表與分類是一對多關系 tags = models.ManyToManyField(Tag,verbose_name='標簽', blank=True) #使用外鍵關聯標簽表與標簽是多對多關系 img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章圖片', blank=True, null=True) body = models.TextField() user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') """ 文章作者,這里User是從django.contrib.auth.models導入的。 這里我們通過 ForeignKey 把文章和 User 關聯了起來。 """ views = models.PositiveIntegerField('閱讀量', default=0) tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推薦位', blank=True, null=True) created_time = models.DateTimeField('發布時間', auto_now_add=True) modified_time = models.DateTimeField('修改時間', auto_now=True) class Meta: verbose_name = '文章' verbose_name_plural = '文章' def __str__(self): return self.title #Banner class Banner(models.Model): text_info = models.CharField('標題', max_length=50, default='') img = models.ImageField('輪播圖', upload_to='banner/') link_url = models.URLField('圖片鏈接', max_length=100) is_active = models.BooleanField('是否是active', default=False) def __str__(self): return self.text_info class Meta: verbose_name = '輪播圖' verbose_name_plural = '輪播圖' #友情鏈接 class Link(models.Model): name = models.CharField('鏈接名稱', max_length=20) linkurl = models.URLField('網址',max_length=100) def __str__(self): return self.name class Meta: verbose_name = '友情鏈接' verbose_name_plural = '友情鏈接'
其中,文章與分類是一對多的關系,文章與標簽是多對多的關系,文章與作者是一對多的關系,文章與推薦位是一對多的關系;
上面Article類中的img表示圖片封面字段,article_img/為上傳目錄,%Y/%m/%d/為自動在上傳的圖片上加上文件上傳的時間。
完成上面的model編寫之后,我們僅僅是完成了model的代碼編寫,但是這些模型並沒有真正的在數據庫中創建表,我們接下來就需要進行數據庫遷移!
在進行數據庫遷移之前我們需要先配置Django項目使用MySQL數據庫(如果使用默認的數據庫那就不用配置了),mysql配置請參考:Django項目如何使用mysql數據庫
在數據庫配置好之后,我們就可以來進行數據庫遷移啦!數據庫遷移非常的簡單,只需要執行以下命令即可:
python3 manage.py makemigrations
python3 manage.py migrate
遷移的時候可能會提示需要安裝Pillow,出現這個錯誤的原因是因為我們的Article和Banner類使用了圖片字段ImageField,我們需要用到圖片處理包,按照錯誤提示執行安裝Pillow模塊就可以了:
pip3 install Pillow
Pillow模塊安裝成功之后,再執行遷移數據庫:
數據庫遷移成功之后,程序會在blog下的migrations目錄里自動生成幾個000開頭的文件,文件里面記錄着數據庫遷移記錄:
數據庫遷移后查看數據庫中表,表名默認為:應用名稱_模型名稱:
至此,我們的模型model就創建成功了!