Django 小實例S1 簡易學生選課管理系統 第3節——創建用戶模型(model)
點擊查看教程總目錄
作者自我介紹:b站小UP主,時常直播編程+紅警三,python1對1輔導老師。
本文涉及到的新的額外知識點:
models
沒有這部分基礎的讀者,建議一邊閱讀本文一邊查閱相關知識
這里推薦我的專欄:Django自學筆記 第四章內容
數據庫表的設計已在本專欄之前的博客做好了:一、項目流程梳理與數據庫設計
這里對於用戶模塊,需要學生表和教師表,
那么對應的,這里需要建立兩種模型:學生(Student),教師(Teacher)
模型的添加和修改要在對應app
的models.py
中進行
首先,打開項目下的./user/models.py
文件
其初始內容如下:
from django.db import models
# Create your models here.
其中第一行導入了models
類,如果你的models.py
文件沒有導入,請添加這一行
同時開始添加自己的模型代碼后,最好把第三行的注釋刪掉
1 添加學生模型
在models.py
中添加如下代碼即可
class Student(models.Model):
genders = [
("m", "男"),
("f", "女")
]
name = models.CharField(max_length=50, verbose_name="姓名")
gender = models.CharField(max_length=10, choices=genders, default='m', verbose_name="性別")
birthday = models.DateField(verbose_name="生日")
email = models.EmailField(verbose_name="郵箱")
info = models.CharField(max_length=255, verbose_name="個人簡介", help_text="一句話介紹自己,不要超過250字")
grade = models.CharField(max_length=4, verbose_name="年級")
number = models.CharField(max_length=6, verbose_name="年級子學號")
password = models.CharField(max_length=30, verbose_name="密碼")
class Meta:
constraints = [
# 復合主鍵:保證 grade和number組合的student_id唯一
models.UniqueConstraint(fields=['grade', 'number'], name='student_id'),
]
def get_id(self):
return "%s%s" % (self.grade, self.number)
def __str__(self):
return "%s (%s)" % (self.get_id(), self.name)
說明:學生年級號為4位數字組成的字符串,年級下子學號為6位數字組成的字符串。
這兩個連接起來組成學生的唯一學號,該學號也為其登錄使用的賬號。
比如學生李大爽,年級號為"2020"
,子學號為"000001"
,其學號為"2020000001"
。
2 添加老師模型
在models.py
中繼續添加如下代碼即可
class Teacher(models.Model):
genders = [
("m", "男"),
("f", "女")
]
name = models.CharField(max_length=50, verbose_name="姓名")
gender = models.CharField(max_length=10, choices=genders, default='m', verbose_name="性別")
birthday = models.DateField(verbose_name="生日")
email = models.EmailField(verbose_name="郵箱")
info = models.CharField(max_length=255, verbose_name="教師簡介", help_text="不要超過250字")
department_no = models.CharField(max_length=3, verbose_name="院系號")
number = models.CharField(max_length=7, verbose_name="院內編號")
password = models.CharField(max_length=30, verbose_name="密碼")
class Meta:
constraints = [
# 復合主鍵:保證 grade和number組合的student_id唯一
models.UniqueConstraint(fields=['department_no', 'number'], name='teacher_id'),
]
def get_id(self):
return "%s%s" % (self.department_no, self.number)
def __str__(self):
return "%s (%s)" % (self.get_id(), self.name)
說明:老師院系號為3位數字組成的字符串,院內編號為7位數字組成的字符串。
這兩個連接起來組成老師的唯一教師號,該教師號也為其登錄使用的賬號。
比如老師牛有力,院系號為"266"
,院內編號為"0000001"
,其教師號為"2660000001"
。
3 建立(更新)數據庫
在django框架下,並不是添加好模型(model)就萬事大吉了
添加好模型后,我們還需要手動執行腳本,才能根據模型生成對應的數據庫表。
在項目文件夾下,打開命令行,按行依次執行:
python manage.py makemigrations
python manage.py migrate
解釋下上面這兩句的作用
其中第1句會生成對應的遷移(migrations)命令。
具體到本項目,由於是第一次運行,
那么會在./user/migrations
文件夾下,
生成0001_initial.py
用於記錄遷移(migrations)命令
第一次運行也會在項目文件夾下,生成一個空的 database:db.sqlite3
第2句會執行第一句中生成的遷移(migrations)命令。
執行完第二句,改動才真正更新到數據庫文件了。
對應到本項目,就是數據庫中添加了兩個模型(學生、老師)對應的數據庫表。
當然,實際上,數據庫中的改動並不是簡單的添加了這兩個模型的事,有興趣的朋友可以打開此時的
db.sqlite3
看看。無法直接打開,需要使用對應的軟件,我一般用DB Browser (SQLite),里面生成了很多個表,不過這個細說起來就復雜了。
以后我們如果修改了模型的屬性之類,也要執行上面兩句腳本去更新對應的數據庫表。