系統(tǒng):Windows 7
語言版本:Anaconda3-4.3.0.1-Windows-x86_64
編輯器:pycharm-community-2016.3.2
Django:2.1.4
Python:3.6.0
- 本系列介紹如何搭建一個(gè)網(wǎng)站,后端使用django框架
- 今天開始介紹一個(gè)單獨(dú)的項(xiàng)目app,關(guān)于學(xué)生成績管理的網(wǎng)站的搭建
- 主要功能包括:學(xué)習(xí)成績查詢,數(shù)據(jù)統(tǒng)計(jì)分析
- 涉及前端模塊:Datatables、ECharts、JQuery
Part 1:目標(biāo)
- 本文的目標(biāo)跟大家說說對(duì)于數(shù)據(jù)庫的ORM操作
- 本示例中使用的數(shù)據(jù)庫為MySQL,我們可以通過傳統(tǒng)的SQL進(jìn)行增刪改查,但想想寫一個(gè)多個(gè)條件的SQL語句就頭大。Django中自帶的ORM功能將這一過程簡單化,但缺點(diǎn)是存在部分的性能丟失
Part 2:數(shù)據(jù)庫創(chuàng)建
傳統(tǒng)上我們可以在類似于MySQL Workbench這樣的軟件中手動(dòng)創(chuàng)建數(shù)據(jù)庫的表,如下圖所示,當(dāng)然也可以通過SQL代碼來創(chuàng)建
回想一下,我們一般需要輸入哪些信息:表名,每個(gè)字段的信息(包括數(shù)據(jù)類型,是否為主鍵,是否為非空,是否唯一,是否自增等)
-
也就是說本質(zhì)上,創(chuàng)建數(shù)據(jù)庫單表過程中,其實(shí)只要輸入這些信息即可,手動(dòng)在數(shù)據(jù)庫操作軟件上實(shí)現(xiàn)或者SQL輸入這些信息都是可以的
2.png 在之前的文章說過,Django中通過在Models里新建一個(gè)Class類,創(chuàng)建一個(gè)表。其實(shí)在這樣的Class類中也涵蓋了如上的這些信息,常用關(guān)鍵字如下:
- 字段類型:CharField(字符串),F(xiàn)loatField(實(shí)數(shù),可以保存小數(shù)),DateTimeField(日期時(shí)間)、DateField(日期)、SmallIntegerField(整數(shù))
-
blank=True, null=True是否允許該字段為空或者null -
max_length允許的最大字符長度,一般與CharField配合使用 -
default=0.0字段默認(rèn)值 -
db_table設(shè)置數(shù)據(jù)庫中表的名字,這是在數(shù)據(jù)庫操作軟件(如Workbench)中能看到的名字,但所有對(duì)數(shù)據(jù)庫的操作使用的是該Class的名稱,注意區(qū)別 -
verbose_name是一個(gè)方便理解的名字,在Django的Admin中可以看到,一般僅僅只是方便理解,可以使用中文 -
unique_together中多個(gè)字段聯(lián)合保持唯一,例如在下面的StudentGrades類中('class_name', 'student_name', 'exam_info', 'course_name')保持唯一,意思是不允許存在這四個(gè)字段一模一樣的兩條記錄
class StudentGrades(models.Model):
class_name = models.CharField(blank=True, null=True, max_length=10, verbose_name='班級(jí)')
student_name = models.CharField(null=False, default='', max_length=10, verbose_name='學(xué)生姓名')
exam_info = models.CharField(blank=True, null=True, max_length=20, verbose_name='模擬考信息')
course_name = models.CharField(blank=True, null=True, max_length=20, verbose_name='科目')
grades = models.FloatField(blank=False, null=False, default=0.0, verbose_name="學(xué)習(xí)成績")
class Meta:
unique_together = ('class_name', 'student_name', 'exam_info', 'course_name')
db_table = 'grades_record'
verbose_name = "學(xué)習(xí)成績記錄"
verbose_name_plural = verbose_name
Part 3:數(shù)據(jù)庫操作 - 增
- 下面所說表類名表示Models對(duì)應(yīng)數(shù)據(jù)庫表的類名,如本示例中的
StudentGrades -
表類名.objects.create(**new_dict_data)創(chuàng)建一條新的記錄,其中new_dict_data為一個(gè)字典,字典的鍵為字典的名字,值為對(duì)應(yīng)字段的取值。也就是說new_dict_data的寫法一般如下
new_dict_data["field_1"] = value_1
new_dict_data["field_2"] = value_2
new_dict_data["field_3"] = value_3
new_dict_data["field_4"] = value_4
new_dict_data["field_5"] = value_5
new_dict_data["field_6"] = value_6
-
**new_dict_data是一種縮略寫法,是Python中一種關(guān)鍵參數(shù)的表示方法**kwargs,如下示例
**kwargs

4.png
執(zhí)行結(jié)果

5.png
Part 4:數(shù)據(jù)庫操作 - 刪
-
表類名.objects.filter(filter_condition).delete(),其中filter_condition表示擬刪除記錄的條件,例如student_name="張三",即字段student_name中為張三的所有記錄- filter_condition這塊還可以實(shí)現(xiàn)一些非常復(fù)雜的條件,這涉及到另外一個(gè)知識(shí)點(diǎn),這個(gè)在后文中會(huì)說一些
以上為本次的學(xué)習(xí)內(nèi)容,下回見
長按圖片識(shí)別二維碼,關(guān)注本公眾號(hào)
Python 優(yōu)雅 帥氣

12x0.8.jpg
