2018-09-12Django模型設計概念

補:運算符

(語文成績和數(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)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末公荧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铣卡,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件头遭,死亡現(xiàn)場離奇詭異呛哟,居然都是意外死亡,警方通過查閱死者的電腦和手機胸梆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門敦捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碰镜,你說我怎么就攤上這事兢卵。” “怎么了绪颖?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵秽荤,是天一觀的道長。 經常有香客問我柠横,道長窃款,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任牍氛,我火速辦了婚禮晨继,結果婚禮上,老公的妹妹穿的比我還像新娘搬俊。我一直安慰自己紊扬,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布悠抹。 她就那樣靜靜地躺著珠月,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楔敌。 梳的紋絲不亂的頭發(fā)上啤挎,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音,去河邊找鬼庆聘。 笑死胜臊,一個胖子當著我的面吹牛,可吹牛的內容都是我干的伙判。 我是一名探鬼主播象对,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宴抚!你這毒婦竟也來了勒魔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤菇曲,失蹤者是張志新(化名)和其女友劉穎冠绢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體常潮,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡弟胀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊式。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵户。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岔留,靈堂內的尸體忽然破棺而出夏哭,到底是詐尸還是另有隱情,我是刑警寧澤贸诚,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布方庭,位于F島的核電站,受9級特大地震影響酱固,放射性物質發(fā)生泄漏械念。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一运悲、第九天 我趴在偏房一處隱蔽的房頂上張望龄减。 院中可真熱鬧,春花似錦班眯、人聲如沸希停。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宠能。三九已至,卻和暖如春磁餐,著一層夾襖步出監(jiān)牢的瞬間违崇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羞延,地道東北人渣淳。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像伴箩,于是被迫代替她去往敵國和親入愧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容