day44-模型設(shè)計

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對象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘸彤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笛钝,更是在濱河造成了極大的恐慌质况,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玻靡,死亡現(xiàn)場離奇詭異结榄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)囤捻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門臼朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事视哑⌒宸瘢” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵挡毅,是天一觀的道長蒜撮。 經(jīng)常有香客問我,道長慷嗜,這世上最難降的妖魔是什么淀弹? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮庆械,結(jié)果婚禮上薇溃,老公的妹妹穿的比我還像新娘。我一直安慰自己缭乘,他們只是感情好沐序,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕绩,像睡著了一般策幼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奴紧,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天特姐,我揣著相機(jī)與錄音,去河邊找鬼黍氮。 笑死唐含,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沫浆。 我是一名探鬼主播捷枯,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼专执!你這毒婦竟也來了淮捆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤本股,失蹤者是張志新(化名)和其女友劉穎攀痊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拄显,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蚕苇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凿叠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盒件,靈堂內(nèi)的尸體忽然破棺而出蹬碧,到底是詐尸還是另有隱情,我是刑警寧澤炒刁,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布恩沽,位于F島的核電站,受9級特大地震影響翔始,放射性物質(zhì)發(fā)生泄漏罗心。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一城瞎、第九天 我趴在偏房一處隱蔽的房頂上張望渤闷。 院中可真熱鬧,春花似錦脖镀、人聲如沸飒箭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弦蹂。三九已至,卻和暖如春强窖,著一層夾襖步出監(jiān)牢的瞬間凸椿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工翅溺, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脑漫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓未巫,卻偏偏與公主長得像窿撬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叙凡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,813評論 0 8
  • Django 1.8.2 文檔Home | Table of contents | Index | Modules...
    軒轅小愛閱讀 2,345評論 0 2
  • 今晚劈伴,看了一場世界杯比賽,巴西對哥斯達(dá)黎加握爷。經(jīng)過九十八分鐘的鏖戰(zhàn)跛璧,巴西憑借補時的兩粒進(jìn)球戰(zhàn)勝了對手。比賽結(jié)束的那一...
    善為道者閱讀 250評論 0 0
  • 讓我們從已被臨床驗證的科技和復(fù)雜的護(hù)膚配方著手新啼,看看如何解決色素沉著過度的問題追城。 1.防曬 對付黑斑最重要的方法很...
  • 遙映人間冰雪樣, 暗香幽浮曲臨江遍識天下英雄路燥撞, 俯首江左有梅郎 序:一曲瑯琊心憔悴座柱,風(fēng)中眼淚誰來陪迷帜?世間恩仇道不...
    怡nid閱讀 668評論 0 11