1模型設(shè)計部分參數(shù)
1.1遷移表中db_table
指定db_table參數(shù),表示模型遷移時竭贩,映射到數(shù)據(jù)庫中的表名稱
如果沒指定db_table參數(shù)蚜印,則數(shù)據(jù)庫中模型映射的表名為:應(yīng)用名(app)_模型名
1.2模型中的外鍵約束中的on_delete參數(shù)
on_delete=models.CASCADE:不能刪除主表,從表相應(yīng)數(shù)據(jù)可以被刪除(默認(rèn))
on_delete=models.PROTECT:不讓刪主表留量,但可以刪從表
on_delete=models.SET_NULL:刪除主表窄赋,從表的關(guān)聯(lián)字段(外鍵)設(shè)置為空
1.3模型中外鍵約束中的related_name參數(shù)
related_name:關(guān)聯(lián)對象反向引用描述符
related_name='info':給反向引用描述符命名為info;如果不設(shè)置楼熄,則默認(rèn)為模型名的全小寫
2模型設(shè)計部分字段類型
CharField:字符串類型
TextField:存儲長文本內(nèi)容忆绰,前端的areatext標(biāo)簽
IntegerField:整型
ImageField:字符串類型,用于存圖片
BooleanField:布爾孝赫,True或者False
DateTimeField:日期较木,年月日時分秒
DateField:年月日
FloatField:浮點類型
DecimalField:浮點類型,限制最大長度和小數(shù)點后的長度
unique:是否唯一
default:默認(rèn)值
null:是否可以為空
primary_key:主鍵(電腦可以自己賦值)
auto_now_add:創(chuàng)建時青柄,默認(rèn)賦值為當(dāng)前時間
auto_now:在創(chuàng)建或者修改時,默認(rèn)賦值為當(dāng)前時間(更新時只能用save方法更新)
max_length:最大長度
3一對一模型中給從表添加對象
一對一(OneToOneField)预侯,常寫作(1:1)致开,定義在模型中的任何一方都可以
存儲:
關(guān)聯(lián)字段存儲1:stu_info.關(guān)聯(lián)字段=關(guān)聯(lián)對象
stu_info.stu=Student.objects.get(id=1)
關(guān)聯(lián)字段存儲2: stu_info.關(guān)聯(lián)字段_id=主鍵id值
stu_info.stu_id=1
查詢:
學(xué)生對象查拓展表對象:學(xué)生對象.拓展模型名稱的小寫
拓展表查詢學(xué)生對象:拓展表對象.外鍵約束字段
學(xué)生與其緊急聯(lián)系人之間為一對一模型關(guān)系
先在models中創(chuàng)建StudentInfo模型
class StudentInfo(models.Model):
s_no = models.CharField(max_length=10,null=False)
phone = models.CharField(max_length=11,null=True)
name = models.CharField(max_length=10,null=True)
設(shè)置stu字段并為其設(shè)置為1對1屬性
stu = models.OneToOneField(Student,on_delete=models.SET_NULL,
related_name='info',null=True)
在對從表添加數(shù)據(jù)并為其主鍵賦值時,有兩種寫法
stu_info(從表對象).stu(從表字段)=Student.objects.get(id=1)(主表具體的對象)
stu_info.stu_id(外鍵)=1(主表對應(yīng)的主鍵)萎馅;功能都是相同的双戳。
3.1對外鍵賦值方法一
def add_stu_info(request):
stu_info = StudentInfo()
stu_info.s_no='12556'
stu_info.phone='13981366521'
stu_info.name='小王'
stu_info.stu=Student.objects.get(id=1)
stu_info.save()
return HttpResponse('創(chuàng)建拓展信息成功')
3.2對外鍵賦值方法二
def add_stu_info(request):
stu_info = StudentInfo()
stu_info.s_no='12556'
stu_info.phone='13981366521'
stu_info.name='小王'
stu_info.stu_id=1
stu_info.save()
return HttpResponse('創(chuàng)建拓展信息成功')
4一對一模型中通過主表查詢從表(不用related_name參數(shù))
過程:
1.查詢主表(學(xué)生)對象
2.通過主表(學(xué)生)對象查詢從表(拓展表)對象
在主表查從表獲取連表條件時有兩種寫法:
stu_info=StudentInfo.objects.filter(stu(從表字段)=stu(主表對象)).first()
stu_info=StudentInfo.objects.filter(stu_id(從表字段)=stu.id(主表對象的屬性)).first()
4.1查詢方法1
def sel_phone_by_stu(request):
stu=Student.objects.filter(s_name='小明').first()
stu_info=StudentInfo.objects.filter(stu=stu).first()
phone=stu_info.phone
return HttpResponse('查詢電話成功')
4.2查詢方法2
def sel_phone_by_stu(request):
stu=Student.objects.filter(s_name='小明').first()
stu_info=StudentInfo.objects.filter(stu_id=stu.id).first()
phone=stu_info.phone
return HttpResponse('查詢電話成功')
5一對一模型中通過主表查詢從表(用related_name參數(shù))
反向引用過程:
1.查詢學(xué)生對象
2.反向查詢;關(guān)聯(lián)模型對象糜芳,關(guān)聯(lián)另外一個模型的名稱的小寫
5.1使用模型中默認(rèn)的related_name參數(shù)
模型中默認(rèn)的related_name參數(shù)為模型名的全小寫
def sel_phone_by_stu2(request):
stu=Student.objects.filter(s_name='小明').first()
stu_info = stu.studentinfo #studentinfo反向引用符
phone=stu_info.phone
print(phone)
return HttpResponse('查詢電話成功')
5.2使用設(shè)置的related_name參數(shù)
在模型中的主鍵中設(shè)置:stu = models.OneToOneField(Student,on_delete=models.SET_NULL,
related_name='info',null=True)飒货;將related_name設(shè)置為info
def sel_phone_by_stu2(request):
stu=Student.objects.filter(s_name='小明').first()
stu_info = stu.info #info反向引用符
phone=stu_info.phone
print(phone)
return HttpResponse('查詢電話成功')
6一對一模型中通過從表查詢主表
1.查詢拓展表信息
2.查詢學(xué)生對象
def sel_stu_by_info(request):
stu_info=StudentInfo.objects.filter(s_no='12556').first()
stu(學(xué)生對象)=stu_info(拓展對象).stu(拓展表字段)
print(stu.s_name)
return HttpResponse('查詢成功')
7一對一模型中刪除信息
當(dāng)模型中為關(guān)聯(lián)字段設(shè)置on_delete時魄衅,各參數(shù)的意義;
stu = models.OneToOneField(Student,on_delete=models.SET_NULL)
on_delete=models.CASCADE:不能刪除主表塘辅,從表相應(yīng)數(shù)據(jù)可以被刪除(默認(rèn))
on_delete=models.PROTECT:不讓刪主表晃虫,但可以刪從表
on_delete=models.SET_NULL:刪除主表,從表的關(guān)聯(lián)字段(外鍵)設(shè)置為空
def on_delete_stu(request):
Student.objects.filter(s_name='小明').delete()
return HttpResponse('刪除成功')
8一對多模型中創(chuàng)建班級
一對多(ForeignKey)扣墩,常寫作(1:N)哲银,定義在多的一方
存儲(給學(xué)生設(shè)置班級):
關(guān)聯(lián)字段的存儲1:學(xué)生對象.關(guān)系字段=關(guān)聯(lián)模型對象
關(guān)聯(lián)字段的存儲2:學(xué)生對象.關(guān)系字段_id=關(guān)聯(lián)表的主鍵id值
查詢:
若沒有定義related_name參數(shù):
學(xué)生查詢班級:班級對象=多的一方(學(xué)生)對象.關(guān)聯(lián)字段
班級查詢學(xué)生:一的一方(班級).關(guān)聯(lián)模型名的小寫_s
若定義了related_name參數(shù):
學(xué)生查班級:多的一方(學(xué)生)對象.關(guān)聯(lián)字段
班級查詢學(xué)生:一的一方(班級).related_name參數(shù)名
先創(chuàng)建一個班級模型;班級與學(xué)生之間為一對多模型
class Grade(models.Model):
g_name=models.CharField(max_length=10,unique=True)
class Meta:
db_table='grade'
def add_grade(request):
Grade.objects.create(g_name='java1807')
return HttpResponse('添加班級成功')
9給學(xué)生設(shè)置班級
def stu_grade(request):
stu=Student.objects.get(pk=4)
stu.g_id=1 #給該對象的g_id屬性(班級)賦值為1
stu.save()
return HttpResponse('分配學(xué)生班級成功')
10通過學(xué)生查詢班級
def sel_grade_by_stu(request):
# 獲取姓名叫小明2的學(xué)生對象
stu=Student.objects.get(s_name='小明2')
# 獲取班級對象
grade=stu.g
print(grade.g_name)
return HttpResponse('查詢成功')
11通過班級查詢學(xué)生
def sel_stu_by_grade(request):
grade=Grade.objects.get(g_name='python1808')
stus=grade.student_set.all()
print(stus)#返回含有對象的列表
stus=grade.student_set
print(stus)#返回app.Student.None
return HttpResponse('查詢成功')
12多對多模型中創(chuàng)建課程
多對多(ManyToManyField)呻惕,常寫作(N:M)荆责,可以定義在模型中的任何一方
多對多的存儲同一對多一樣;
1.在查詢方面如果沒有設(shè)置related_name參數(shù)亚脆;
當(dāng)用課程查詢學(xué)生時做院,查詢方式為:課程對象.關(guān)聯(lián)字段.filter()
用學(xué)生查詢課程時,查詢方式為:學(xué)生對象.關(guān)聯(lián)模型名的小寫_set
2.如果設(shè)置了related_name參數(shù):
用課程查詢學(xué)生:課程對象.關(guān)聯(lián)字段.filter().all()
用學(xué)生查詢課程:學(xué)生對象.related_name參數(shù).filter().all()
創(chuàng)建一個課程表濒持,課程與學(xué)生之間為多對多關(guān)系
class Course(models.Model):
c_name=models.CharField(max_length=10,unique=True)
# ManyToManyField字段定義在任何一個模型都可以
stu=models.ManyToManyField(Student,null=True)
class Meta:
db_table='course'
往課程表中添加課程
def add_course(request):
c_names=['大學(xué)英語','高等數(shù)學(xué)','巖漿巖巖石學(xué)',
'線性代數(shù)','概率論','運籌學(xué)']
for name in c_names:
cou = Course()
cou.c_name=name
cou.save()
return HttpResponse('添加課程成功')
13通過中間表添加刪除學(xué)生或者課程
13.1給學(xué)生添加課程
def add_s_c(request):
cou=Course.objects.get(c_name='高等數(shù)學(xué)')
stu=Student.objects.get(s_name='妲己')
stu.course_set.add(cou)
return HttpResponse('添加中間表成功')
13.2給課程添加學(xué)生
def add_s_c(request):
cou=Course.objects.get(c_name='高等數(shù)學(xué)')
stu=Student.objects.get(s_name='妲己')
cou.stu(學(xué)生模型中反向引用符).add(stu(學(xué)生對象))
return HttpResponse('添加中間表成功')
13.3學(xué)生刪除課程
def add_s_c(request):
cou=Course.objects.get(c_name='高等數(shù)學(xué)')
stu=Student.objects.get(s_name='妲己')
stu.course_set.remove(cou)
return HttpResponse('添加中間表成功')
14前端設(shè)計
14.1配置
在settings.py文件中定義TEMPALTES的目錄地址第58行添加如下文字:'DIRS': [os.path.join(BASE_DIR,'templates')],
os.path.join(BASE_DIR,'templates')中BASE_DIR表示第16行的BASE_DIR獲取到的文件位置键耕,templates表示含有網(wǎng)頁文件的文件夾;os.path.join('a','b')表示文件路徑:a//b
14.2后端渲染模板
使用render()渲染模板
傳遞參數(shù)給模板,render(request,模板名,{key1:value1,key2:value2})
from django.shortcuts import render
def index(request):
stus=Student.objects.all()
return render(request,'index.html',{'a':stus})
14.3前端渲染模板
1.解析變量:{{變量}}
2.解析標(biāo)簽:{% 標(biāo)簽 %}{% endfor標(biāo)簽 %}
{{ a }} #解析變量
<br> #換行標(biāo)簽
{% for stu in a %} #for標(biāo)簽
<p>姓名:{{ stu.s_name }}
年齡:{{ stu.s_age }}
班級:{{ stu.g.g_name }}
選課:
{% for c in stu.course_set.all %}
{{ c.c_name }}
{% endfor %}
</p>
{% endfor %} #結(jié)束標(biāo)簽
15總結(jié)
15.1聚合函數(shù)及模糊查詢
聚合函數(shù)(Avg,Max,Sum,Count)的使用
模型名.objects.篩選條件.aggregate(聚合函數(shù)('聚合條件'))
模糊查詢(contains弥喉、startswith及endswith)
模型名.objects.filter(查詢字段__startswith='查詢內(nèi)容')
15.2related_name參數(shù)
模型中外鍵約束中的related_name參數(shù):
related_name:關(guān)聯(lián)對象反向引用描述符郁竟;當(dāng)為一對一關(guān)系時,related_name參數(shù)默認(rèn)為對應(yīng)模型的模型名全小寫由境;當(dāng)為一對多或者多對多關(guān)系時棚亩,默認(rèn)為對應(yīng)模型的模型名小寫_set
15.3用主表給從表關(guān)聯(lián)字段賦值
當(dāng)用主表中的信息(主鍵)給從表的關(guān)聯(lián)字段(外鍵)賦值時:
從表對象.關(guān)聯(lián)字段=主表對象(主表對象要唯一) 或者 從表對象.關(guān)聯(lián)字段_id=要賦的主表對象對應(yīng)的主鍵具體值
15.4不用related_name用主表查從表
當(dāng)不用related_name參數(shù)查詢時:
當(dāng)用主表查從表時(無關(guān)聯(lián)參數(shù)的一方查有關(guān)聯(lián)參數(shù)的一方),先生成主表對象虏杰;然后從表對象=從表模型名.objects.filter(關(guān)聯(lián)字段=主表對象/關(guān)聯(lián)字段_id=主表對象.id).first()
15.5用related_name查詢
當(dāng)用related_name參數(shù)查詢時:
當(dāng)用主表查從表時(無關(guān)聯(lián)參數(shù)的一方查有關(guān)聯(lián)參數(shù)的一方)讥蟆,需要用related_name參數(shù)生成從表對象(從表對象=主表對象.related_name參數(shù)/當(dāng)為一對多關(guān)系時,還要在后面接上.all()才是查詢集集合)
當(dāng)用從表查主表時(有關(guān)聯(lián)參數(shù)的一方查無關(guān)聯(lián)參數(shù)的一方)纺阔,直接用關(guān)聯(lián)字段生成主表對象(主表對象=從表對象.關(guān)聯(lián)字段)
15.6多對多中間表數(shù)據(jù)的添加與刪除
當(dāng)為多(M)對多(N)關(guān)系時:
往中間表中添加數(shù)據(jù):M對象.N的related_name參數(shù).add(N對象)
在中間表中刪除數(shù)據(jù):M對象.N的related_name參數(shù).remove(N對象)