補:運算符
(語文成績和數(shù)學成績均為Student類的屬性)
math=models.DecimalField(max_digits=4,decimal_places=2,null=True)
chinese=models.DecimalField(max_digits=4,decimal_places=2,null=True)
用運算符實現(xiàn)查詢語文成績比數(shù)學成績至少低10分的學生
stud = Student.objecects.filter(math__gtb=F('chinese') + 10)
新內容
模型設計概念:一對一乙漓,一對多级历,多對多的模型定義
模型設計案例:學生和學生拓展表一對一模型設計,學生和課程表多對多模型設計叭披,學生和班級一對多模型設計
1.一對一關聯(lián)(學生與學生信息)
首先在已經定義好的app文件夾中的models.py文件中定義新的類寥殖,為學生信息類
class StudentInfo(models.Model):
phone=models.CharField(max_length=11,null=True,unique=True,verbose_name='手機號')
address=models.CharField(max_length=50,null=True,verbose_name='地址')
class Meta:
db_table='student_info'
同時啟動控制臺Terminal來進行數(shù)據庫的遷移
python manage.py makemigrations
python manage.py migrate
該類的定義要定義在Student類的前面,以免不必要的報錯
然后在Student類中添加屬性關聯(lián)
stu_info=models.OneToOneField(StudentInfo,null=True,related_name='stu')
然后在urls.py文件中添加新的url
url('create_stu_info/',views.create_stu_info),
url('stu_add_stuinfo/',views.stu_add_stuinfo),
然后在views.py文件中定義對應的類方法涩蜘,第一條url對應的類方法為為創(chuàng)建的學生信息類StudentInfo創(chuàng)建數(shù)據,第二條url則是兩個類之間的關聯(lián)
def create_stu_info(request):
if request.method == 'GET':
data = {
'13333454561': '金牛區(qū)1',
'13333454562': '金牛區(qū)2',
'13333454563': '金牛區(qū)3',
'13333454564': '金牛區(qū)4',
'13333454565': '金牛區(qū)5',
'13333454566': '金牛區(qū)6',
'13333454567': '金牛區(qū)7',
'13333454568': '金牛區(qū)8',
}
for k, v in data.items():
StudentInfo.objects.create(phone=k, address=v)
return HttpResponse('創(chuàng)建成功')
def stu_add_stuinfo(request):
if request.method == 'GET':
stu = Student.objects.get(id=7)
# 綁定關系1:
# stu.stu_info_id=2
# 綁定關系2:
stu.stu_info = StudentInfo.objects.get(id=7)
stu.save()
return HttpResponse('綁定學生關系')
這里暫時只考慮request.method的值為GET時的情況嚼贡,這樣Student類和StudentInfo類就完成1對1的綁定(get(id=x)的值相應變換代表著不同id之間的數(shù)據的綁定)
做完了綁定,就可以進行查詢操作
添加新的url
url('sel_phone/',views.sel_phone), #通過學生來查找學生信息
url('sel_stu_byphone/',views.sel_stu_byphone), #通過學生信息來查找學生
再在views.py中定義新的類
'''
通過學生來查找學生信息
'''
def sel_phone(request):
if request.method == 'GET':
# 獲取學生id=2的學生的手機號
# 方法1
# stu=Student.objects.filter(id=2).first()
# info_id=stu.stu_info_id
# stu_info=StudentInfo.objects.get(pk=info_id)
# phone=stu_info.phone
# 方法2
stu = Student.objects.get(id=1)
stu_info = stu.stu_info
phone = stu_info.phone
return HttpResponse('通過學生id查找手機號')
'''
通過學生信息來查找學生
'''
def sel_stu_byphone(request):
if request.method == 'GET':
stu_info = StudentInfo.objects.get(phone='13333454562')
stu = stu_info.student
s_name = stu.s_name
return HttpResponse('通過手機查詢學生信息')
M搿T敛摺!注意:其重點在于掌握一對一的綁定與查詢與反向查詢
2.一對多(學生與班級)
同理误窖,在models.py文件中定義班級類Grade
class Grade(models.Model):
g_name=models.CharField(max_length=10,unique=True,verbose_name='班級')
class Meta:
db_table='grade'
然后數(shù)據庫遷移
python manage.py makemigrations
python manage.py migrate
在Student類中添加添加關聯(lián)屬性
g=models.ForeignKey(Grade,null=True,related_name='stu')
下一步就是在urls.py中添加新的url
url('create_grade/',views.create_grade), #創(chuàng)建班級信息
url('sel_stu_bygrade/',views.sel_stu_bygrade), #班級與學生信息之間的查詢
最后在views.py中定義url中對應的類
中間省略了一部分內容為學生類與班級類的綁定叮盘,其實現(xiàn)方法有兩種:
一:通過創(chuàng)建類來進行綁定,其原理與上面一對一中綁定關系的方法相同
二:通過navicat軟件與mysql連接后手動添加(此方法更便捷)
'''
創(chuàng)建班級信息
'''
def create_grade(request):
if request.method=='GET':
# 創(chuàng)建班級
data1=[
'py1801',
'py1802',
'py1803',
'py1804',
'py1805',
'py1806',
'py1807',
]
for x in data1:
Grade.objects.create(g_name=x)
return HttpResponse('創(chuàng)建成功')
'''
班級與學生信息之間的查詢 (重點掌握查詢與反向查詢E场H岷稹!1蟆)
'''
def sel_stu_bygrade(request):
if request.method=='GET':
# 查詢吳彥祖對應的班級名稱
stu=Student.objects.get(s_name='吳彥祖')
g=stu.g
grade=g.g_name
return HttpResponse('通過學生姓名查班級')
# 通過班級名查詢班級內的學生信息
g=Grade.objects.filter(g_name='py1805').first()
stus=g.stu.all()
stu_name1 = [(stu.s_name, stu.id) for stu in stus]
return HttpResponse(stu_name1)
3.多對多(學生與課程)
原理同上
在在models.py文件中定義課程類Course
class Course(models.Model):
c_name=models.CharField(max_length=10,null=True)
class Meta:
db_table='course'
然后數(shù)據庫遷移(見一對一與一對多的遷移)
其次是在Student類中添加關聯(lián)屬性
c=models.ManyToManyField(Course,null=True,related_name='stu')
再然后就是添加url愈魏,這個也可見上面的一對一和一對多,其原理是相同的,不同的只是類方法的名字而已
最后創(chuàng)建類
因在數(shù)據庫遷移的時候與前兩種關聯(lián)有區(qū)別培漏,會產生新的關聯(lián)表溪厘,所以其綁定關系的方法也與一對一和一對多有一定的區(qū)別
'''
創(chuàng)建課程信息
'''
def create_course(request):
if request.method=='GET':
# 添加課程
data2=[
'語文',
'數(shù)學',
'英語',
'物理',
'化學'
]
for x in data2:
Course.objects.create(c_name=x)
return HttpResponse('創(chuàng)建學科成功')
'''
課程與學生之間的綁定(多對多)(重點掌握!1惫丁W恕4虮瘛S卓痢)
'''
def create_course_stu(request):
if request.method=='GET':
# 添加學生對于課程的信息
# 讓id=1的學生選擇課程(id=1,2)
stu=Student.objects.get(id=1)
# 添加add方法
stu.c.add(1)
return HttpResponse('添加課程成功')
# 給數(shù)學課程和id=2的同學進行關聯(lián)
c=Course.objects.get(c_name='數(shù)學')
stus=c.stu.add(2)
return HttpResponse('關聯(lián)成功')
# 刪除
# stu.c.remove(2)