Django 08 Django模型基礎3(關系表的數據操作、表關聯對象的訪問、多表查詢、聚合、分組、F、Q查詢)


Django 08 Django模型基礎3(關系表的數據操作、表關聯對象的訪問、多表查詢、聚合、分組、F、Q查詢)

一、關系表的數據操作

#為了能方便學習,我們進入項目的idle中去執行我們的操作,通過python  manage.py shell  就能進入當前目錄下的IDLE,類似於數據庫中的python操作

  --- import os #導入os
  ---os.getcwd() #獲取當前路徑
      '/home/pyvip/TK18_07/py_course/hello_django1'
  ---from movie.models import Department,Student,Course,Stu_Detail #從app目錄的models中導入這些類
#以下是在python shell模式中的代碼
>>> from movie.models import Department,Student,Course,Stu_Detail
>>> d2 = Department(d_name = '軟件學院') #初始化類,添加一條數據,軟件學院
>>> d2.save() #刷入數據庫
#表關聯的添加數據的兩種方法
#方法一
>>> s3 = Student(s_name='小白',department_id=2)
>>> s3.save()
#方法二
>>> s4 = Student(s_name='小黑')
>>> s4.department = d2
>>> s4.save()

  需要查詢department中id為1的學院下面有幾個學生,可以通過反向查詢,這就是表關聯對象的訪問

#如果模型I有一個ForeignKey,那么該ForeignKey 所指的模型II實例可以通過一個管理器回前面有ForeignKey的模型I的所有實例。默認情況下,
#這個管理器的名字為foo_set,其中foo 是源模型的小寫名稱。
>>> d1.student_set.all() #用這一步就可以查出d1學院下所有的學生數 #為了簡便起見,可以在定義時設置related_name 參數來覆蓋foo_set 的名稱 department = models.ForeignKey('Department', related_name='student', #這一步將foo_set覆蓋為student on_delete=models.CASCADE)

  同理,manytomany也可以用related_name來覆蓋

 

  處理關聯對象的一些方法add,create

 

#add(obj1, obj2, ...)  添加的已經存在數據庫的數據,添加一指定的模型對象到關聯的對象集中。

#create(**kwargs)  添加不存在的數據 ,將數據直接存入數據庫,創建一個新的對象,將它保存並放在關聯的對象集返回新創建的對象。

 

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.

from .models import Department,Student,Stu_Detail,Course

def test1(request):
    d1 = Department.objects.get(d_id=1)
    s1 = Student.objects.get(s_id=1)
    c1 = Course.objects.get(c_id=1)
    print(d1.student.all()) #d1學院下的所有學生,這是一對多關系;管理器,可通過all()實現
    print(s1.department)    #s1所屬學院,這是模型類里面的屬性,可以直接訪問
    print(c1.student.all()) #報c1課程的所有學生,這是多對多關系,模型有些這個屬性;管理器,可通過all()實現
    print(s1.course.all())  #s1學生所報的課程,這也是多對多關系,可以通過反向查詢_set來實現,可以用related_name來修改反向查詢;
                            # 管理器,可通過all()實現

    ##add()  必須是在數據庫存在的對象,才能添加;
    #方法一: 可以修改內容,例如本來是計算機學院的,將他改為軟件學院
    print(d1.student.all())
    s4 = Student.objects.get(s_id=4)
    d1.student.add(s4) #原本存在s4屬於d2學院,通過add將其改為d1學院
    #方法二:添加
    # s8 = Student(s_name='小狗子')
    # s8.save()
    s8 = Student.objects.get(s_id=8)
    d1.student.add(s8) #將原本department為空的s8添加到d1學院中去

    ##create()  添加數據到數據庫
    s1.course.create(c_name='英語') #通過學生s1的課程中添加一個新的課程英語,同時在student表和course表里面都添加了數據
    d1.student.create(s_name='小熊')

    ##remove() 刪除
    d1.student.remove(s1) #將學生s1從d1學院里面刪除
    s1.course.remove(c1) #將課程c1從學生s1的課程表中刪除

    ##clear() 清空
    s1.course.clear() #清空學生s1的所有課程

    return HttpResponse('這是表關聯對象的方法')

二、多表查詢

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

 

    ##多表查詢
    rs = Student.objects.filter(department__d_name='計算機學院')      #查詢學院名稱為'計算機學院'的學生的信息
    rs = Department.objects.filter(student__s_name__contains='')  #查詢學生名字中包含小的學院的信息
    rs = Course.objects.filter(student__s_id=1)                     #查詢學號為1的課程的信息
    rs = Student.objects.filter(course__c_id=1)                     #查詢報名課程1的學生的信息
    rs = Department.objects.filter(student__course__c_name='python') #查詢報了python課程的學生的所屬學院的信息

 三、其他查詢

  聚合查詢:aggregate()是queryset的一個終止子句,它返回一個包含一些鍵值對的字典

from django.db.models import Count,Avg,Max,Min,Sum
def test(request):
    rs = User.objects.all().aggregate(Avg('age')) #求User表中age的平均數,返回的是字典
    rs = User.objects.all().aggregate(average_age=Avg('age')) #重命名為average_age
    rs = User.objects.all().aggregate(Max('age'),Min('age'),Sum('age')) #求User表中age的最大值,最小值,和,返回的是字典
    print(rs)
    return HttpResponse('XXXX')

  分組查詢:為調用的queryset中每一個對象都生成一個獨立的統計值

    #分組查詢
    rs = Student.objects.all().values('department').annotate(count=Count('department')).values('department_id','count')
        #查詢每個學院有多少個學生,以department為第一查詢,多少個學生也就是count為第二查詢,最后以department_id和count的形式輸出
    rs = Student.objects.all().values('course').annotate(count=Count('course')).values('s_name','count')
        #每個學生報名的課程數量
    rs = Course.objects.all().values('student').annotate(count=Count('student')).values('c_name','count')
        #每個課程報名的學生數

  F查詢:針對兩個字段的值的比較

    #F查詢
    rs = Student.objects.filter(department__d_id__gt=F('s_id')) #學院id小於學生學號的
    rs = User.objects.all().update(age=F('age')+1) #給User表中所有的age加一

  Q查詢:多條件查詢

    #Q查詢
    rs = User.objects.filter(name='taka',age='19') #這是且條件,必須是name為taka,age為19的
    rs = User.objects.filter(Q(name='taka')|Q(name='budong')) #這是或條件
    rs = User.objects.filter(Q(name='tuple')&~Q(age=100)) #這是名字為tuple,id不等於3的條件

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM