2018-09-12Django模型設(shè)計(jì)概念

補(bǔ):運(yùn)算符

(語文成績(jī)和數(shù)學(xué)成績(jī)均為Student類的屬性)

math=models.DecimalField(max_digits=4,decimal_places=2,null=True)
chinese=models.DecimalField(max_digits=4,decimal_places=2,null=True)

用運(yùn)算符實(shí)現(xiàn)查詢語文成績(jī)比數(shù)學(xué)成績(jī)至少低10分的學(xué)生

stud = Student.objecects.filter(math__gtb=F('chinese') + 10)

新內(nèi)容

模型設(shè)計(jì)概念:一對(duì)一,一對(duì)多,多對(duì)多的模型定義
模型設(shè)計(jì)案例:學(xué)生和學(xué)生拓展表一對(duì)一模型設(shè)計(jì),學(xué)生和課程表多對(duì)多模型設(shè)計(jì),學(xué)生和班級(jí)一對(duì)多模型設(shè)計(jì)

1.一對(duì)一關(guān)聯(lián)(學(xué)生與學(xué)生信息)

首先在已經(jīng)定義好的app文件夾中的models.py文件中定義新的類,為學(xué)生信息類

class StudentInfo(models.Model):
    phone=models.CharField(max_length=11,null=True,unique=True,verbose_name='手機(jī)號(hào)')
    address=models.CharField(max_length=50,null=True,verbose_name='地址')

    class Meta:
        db_table='student_info'

同時(shí)啟動(dòng)控制臺(tái)Terminal來進(jìn)行數(shù)據(jù)庫的遷移

python manage.py makemigrations
python manage.py migrate

該類的定義要定義在Student類的前面,以免不必要的報(bào)錯(cuò)
然后在Student類中添加屬性關(guān)聯(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文件中定義對(duì)應(yīng)的類方法,第一條url對(duì)應(yīng)的類方法為為創(chuàng)建的學(xué)生信息類StudentInfo創(chuàng)建數(shù)據(jù),第二條url則是兩個(gè)類之間的關(guān)聯(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)
        # 綁定關(guān)系1:
        # stu.stu_info_id=2
        # 綁定關(guān)系2:
        stu.stu_info = StudentInfo.objects.get(id=7)
        stu.save()
        return HttpResponse('綁定學(xué)生關(guān)系')

這里暫時(shí)只考慮request.method的值為GET時(shí)的情況,這樣Student類和StudentInfo類就完成1對(duì)1的綁定(get(id=x)的值相應(yīng)變換代表著不同id之間的數(shù)據(jù)的綁定)

做完了綁定,就可以進(jìn)行查詢操作
添加新的url

url('sel_phone/',views.sel_phone),         #通過學(xué)生來查找學(xué)生信息
url('sel_stu_byphone/',views.sel_stu_byphone),      #通過學(xué)生信息來查找學(xué)生

再在views.py中定義新的類

'''
通過學(xué)生來查找學(xué)生信息
'''
def sel_phone(request):
    if request.method == 'GET':
        # 獲取學(xué)生id=2的學(xué)生的手機(jī)號(hào)
        # 方法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('通過學(xué)生id查找手機(jī)號(hào)')
'''
通過學(xué)生信息來查找學(xué)生
'''
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('通過手機(jī)查詢學(xué)生信息')

?。。∽⒁猓浩渲攸c(diǎn)在于掌握一對(duì)一的綁定與查詢與反向查詢

2.一對(duì)多(學(xué)生與班級(jí))

同理,在models.py文件中定義班級(jí)類Grade

class Grade(models.Model):
    g_name=models.CharField(max_length=10,unique=True,verbose_name='班級(jí)')

    class Meta:
        db_table='grade'

然后數(shù)據(jù)庫遷移

python manage.py makemigrations
python manage.py migrate

在Student類中添加添加關(guān)聯(lián)屬性

g=models.ForeignKey(Grade,null=True,related_name='stu')

下一步就是在urls.py中添加新的url

url('create_grade/',views.create_grade),     #創(chuàng)建班級(jí)信息
url('sel_stu_bygrade/',views.sel_stu_bygrade),   #班級(jí)與學(xué)生信息之間的查詢

最后在views.py中定義url中對(duì)應(yīng)的類
中間省略了一部分內(nèi)容為學(xué)生類與班級(jí)類的綁定,其實(shí)現(xiàn)方法有兩種:
一:通過創(chuàng)建類來進(jìn)行綁定,其原理與上面一對(duì)一中綁定關(guān)系的方法相同
二:通過navicat軟件與mysql連接后手動(dòng)添加(此方法更便捷)

'''
創(chuàng)建班級(jí)信息
'''
def create_grade(request):
    if request.method=='GET':
        # 創(chuàng)建班級(jí)
        data1=[
            'py1801',
            'py1802',
            'py1803',
            'py1804',
            'py1805',
            'py1806',
            'py1807',
        ]
        for x in data1:
            Grade.objects.create(g_name=x)
        return HttpResponse('創(chuàng)建成功')


'''
班級(jí)與學(xué)生信息之間的查詢  (重點(diǎn)掌握查詢與反向查詢?。。。。?'''
def sel_stu_bygrade(request):
    if request.method=='GET':
        # 查詢吳彥祖對(duì)應(yīng)的班級(jí)名稱
        stu=Student.objects.get(s_name='吳彥祖')
        g=stu.g
        grade=g.g_name
        return HttpResponse('通過學(xué)生姓名查班級(jí)')

        # 通過班級(jí)名查詢班級(jí)內(nèi)的學(xué)生信息
        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.多對(duì)多(學(xué)生與課程)

原理同上
在在models.py文件中定義課程類Course

class Course(models.Model):
    c_name=models.CharField(max_length=10,null=True)

    class Meta:
        db_table='course'

然后數(shù)據(jù)庫遷移(見一對(duì)一與一對(duì)多的遷移)
其次是在Student類中添加關(guān)聯(lián)屬性

c=models.ManyToManyField(Course,null=True,related_name='stu')

再然后就是添加url,這個(gè)也可見上面的一對(duì)一和一對(duì)多,其原理是相同的,不同的只是類方法的名字而已
最后創(chuàng)建類
因在數(shù)據(jù)庫遷移的時(shí)候與前兩種關(guān)聯(lián)有區(qū)別,會(huì)產(chǎn)生新的關(guān)聯(lián)表,所以其綁定關(guān)系的方法也與一對(duì)一和一對(duì)多有一定的區(qū)別

'''
創(chuàng)建課程信息
'''
def create_course(request):
    if request.method=='GET':
        # 添加課程
        data2=[
            '語文',
            '數(shù)學(xué)',
            '英語',
            '物理',
            '化學(xué)'
        ]
        for x in data2:
            Course.objects.create(c_name=x)
        return HttpResponse('創(chuàng)建學(xué)科成功')


'''
課程與學(xué)生之間的綁定(多對(duì)多)(重點(diǎn)掌握?。。。。。?'''
def create_course_stu(request):
    if request.method=='GET':
        # 添加學(xué)生對(duì)于課程的信息
        # 讓id=1的學(xué)生選擇課程(id=1,2)
        stu=Student.objects.get(id=1)
        # 添加add方法
        stu.c.add(1)
        return HttpResponse('添加課程成功')


        # 給數(shù)學(xué)課程和id=2的同學(xué)進(jìn)行關(guān)聯(lián)
        c=Course.objects.get(c_name='數(shù)學(xué)')
        stus=c.stu.add(2)
        return HttpResponse('關(guān)聯(lián)成功')

        # 刪除
        # stu.c.remove(2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容