(九)Django學習——一對一,一對多,多對多關係表的各種數據操作;跨關聯關係的多表查詢!

1.關係表的數據操作

(1)一對多的數據插入:

在這裏插入圖片描述

①學院表信息的插入(使用了另一種方便的方法進行數據的插入)

在這裏插入圖片描述

②學生表信息的插入(使用常規視圖插入數據)

from .models import User,Article,Department,Student,Course,Stu_detail
def add_user(request):

    #1.根據模型類層面的屬性進行數據的添加            屬性賦值的方法
    #因爲我們在模型類有定義了一個department的屬性, 而這個屬性的對象的類型必須是department表的類實例對象
    d = Department.objects.get(d_id=1)                    #學院表中北大的實例
    Student.objects.create(s_name="小明",department=d)    #外鍵department的字段值必須是實例

    #2.根據數據庫層面的字段名進行數據的添加        需要注意的是外鍵的值必須是關聯表中已經存在的值.
    Student.objects.create(s_name="小紅", department_id=2)

    return HttpResponse("插入數據成功!")

③觀察可知插入成功:

在這裏插入圖片描述

(2)表關聯對象的訪問:

first:基操!

在這裏插入圖片描述

second:

**正向查詢:Student的模型類中我們有定義department的屬性,所以當我們去訪問的時候,可以直接通過student.department的形式去找到某個學生的所屬學院是哪個。
由此發出靈魂拷問:
如果我們也希望在在訪問某個學院的實例對象的學生的時候該怎麼訪問呢???
**

在這裏插入圖片描述

third:

**反向查詢:如果模型Student有一個ForeignKey(會自動給Department類添加一個反向查詢的屬性!),那麼該ForeignKey 所指的模型Department實例可以通過一個管理器回到前面有ForeignKey的模型Studnet的所有實例。默認情況下,這個管理器的名字爲student_set(可以在對應的表關聯API中通過設置related_name的值來自定義),其中student是源模型的小寫名稱。
拓展:兩個表關聯的API(OneToOne,Foreignkey,ManyToMany)在誰那,通過誰去查詢另一個表的信息就是正向查詢;反之就是反向查詢。
注意:只限一對多以及多對多;一對一沒有_set屬性,無法使用!!!
**

在這裏插入圖片描述

拓展:

**可以在定義時設置related_name 參數來覆蓋student_set的名稱.
**
在這裏插入圖片描述

fourth:

反向查詢的一些實用方法:
注意:只限一對多以及多對多;一對一沒有這些方法,無法使用!!!

from .models import User,Article,Department,Student,Course,Stu_detail
def add_user(request):

    d = Department.objects.get(d_id=1)                     #學院表中北大的實例
    d3 = Department.objects.get(d_id=3)                    #學院表中中科的實例

    # create()方法:新建數據
    d.student_set.create(s_name="小王")     #在北大院系下新建一個學生表信息

    # aa()方法:修改已經存在的數據(注意:通過實例)
    s3 = Student.objects.get(s_id=3)        #將s_id爲3的學生的院系從北大換到中科
    d3.student_set.add(s3)      

    return HttpResponse("插入數據成功!")

seventh:一對一表信息的訪問

注意:一對一表關係中使用不了反向查詢!!!

from .models import Department,Student,Course,Stu_detail
def add_user(request):

    s1 = Student.objects.get(s_id=1)                #獲得一個學生的實例對象
    
    print(s1.stu_detail)
    print(dir(s1.stu_detail))                       #會發現沒有反向查詢_set的屬性!
    print(s1.stu_detail.age)                        #只能進行數據查詢,不能添加!

    #注意:一對一關係的話,反向查詢不能使用。所以添加數據只能如下:
    Stu_detail.objects.create(Student_id=s1,age=18,phone=123456)

    return HttpResponse("插入數據成功!")
eigth:多對多表關係:

第一部分:數據的添加及關聯!

在這裏插入圖片描述

from .models import User,Article,Department,Student,Course,Stu_detail
def add_user(request):
    s1 = Student.objects.get(s_id=1)        #小明
    c1 = Course.objects.get(c_id=1)         #c
    #1.數據庫中已存在的數據       將學生表和課程表通過Django自動生成的中間表聯繫起來
    s1.course.add(c1)
    #2.數據庫中沒有的數據          將學生小明與新建的課程"人工智能"聯繫起來
    s1.course.create(c_name="人工智能")

    return HttpResponse("插入數據成功!")

沒有執行之前Django自動生成的中間表是空的:
在這裏插入圖片描述

執行之後Django自動生成的中間表:
在這裏插入圖片描述

第二部分:數據的指定刪除及全部刪除!

from .models import Department,Student,Course,Stu_detail
def add_user(request):
    s1 = Student.objects.get(s_id=1)        #小明
    c1 = Course.objects.get(c_id=1)         #c
    s1.course.remove(c1)                #刪除小明同學的課程c

    s1.course.clear()                   #刪除小明同學的所有課程

    return HttpResponse("插入數據成功!")

2.多表查詢—跨關聯關係的查詢

**Django 提供一種強大而又直觀的方式來“處理”查詢中的關聯關係,它在後臺自動幫你處理JOIN。 若要跨越關聯關係,只需使用關聯的模型字段的名稱,並使用雙下劃線分隔,直至你想要的字段:
**

(得到的都是QuertSet型數據!)

from .models import Department,Student,Course,Stu_detail
def add_user(request):
    #查詢學院名爲‘北大’的學生的信息
    s_all = Student.objects.filter(department__d_name='北大')
    print(s_all)
	
	# 它還可以反向工作。若要引用一個“反向”的關係,只需要使用該模型的小寫的名稱!!!

    #查詢學生名字中包含'小'的學生的學院信息
    d_all = Department.objects.filter(student__s_name__contains='小')
    print(d_all)

    #查詢學號爲1的學生的所有的課程
    c_all = Course.objects.filter(student__s_id=1)
    print(c_all)

    #查詢報了課程3的所有學生
    stu_all = Student.objects.filter(course__c_id=3)
    print(stu_all)

    #查詢報了'python'課程的學生的所屬學院的信息
    cou_all = Department.objects.filter(student__course__c_name='python')
    print(cou_all)

    return HttpResponse("插入數據成功!")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章