""" 返回查詢集的方法稱為過濾器 all() 返回查詢集中所有數據 filter() 返回符合條件的數據 一、filter(鍵=值) 二、filter(鍵=值,鍵=值) #兩個關係為and 三、filter(鍵=值).filter(鍵=值) #兩個關係為and exclude()過濾掉符合邏輯的數 ...
""" 返回查詢集的方法稱為過濾器 all() 返回查詢集中所有數據 filter() 返回符合條件的數據 一、filter(鍵=值) 二、filter(鍵=值,鍵=值) #兩個關係為and 三、filter(鍵=值).filter(鍵=值) #兩個關係為and exclude()過濾掉符合邏輯的數據 order_by()排序 values()一條數據就是一個對象{字典},返回一個列表 返回單個數據: get() 返回一個滿足條件的對象 註意:如果沒有找到符合條件對象,會引發“模型類.DoesNotExist異常” 如果找到多個對象,也會引發“模型類.MultipleObjectsReturnen異常" count() 返回查詢集中的對象個數 first() 返回查詢集中的第一個對象 last() 返回查詢集中的最後一個對象 exists() 判斷查詢集中是否有數據,如果有返回True,沒有返回False 限制查詢集 返回列表,可以使用下標的方法進行限制,註意下標不能是負數 students_list = Students.stuobj.all()[0:5] 這個是顯示5條記錄 下麵是分頁顯示5條記錄 #0-5 6-10 # 1 2 page = int(page) students_list = Students.stuobj.all()[(page-1)*5:page*5] 查詢集的緩存 概述:每個查詢集都包含一個緩存,來最小化對數據加訪問 在新建的查詢集中,緩存首次為空,第一次對查詢集求值,會發生數據緩存,django會將查詢出來的數據做一個緩存,並返回查詢結構,以後查詢的直接查詢查詢集的緩存 欄位查詢 概述 1.實現了SQL中的WHERE語句,作為方法filter(),exclude(),get()參數 2.語法:屬性名稱__比較運算符=值 3.外鍵:屬性名_id 4.轉義:like語句在SQL中使用%是為了匹配點位,匹配數據中的%(where like ‘\%‘) filter(sanme__contains‘%‘) 比較運算符: exact:判斷,大小寫區分,例:filter(isdelete=Flase) contains:包含,大小寫區分,例:students_list=Students.stuobj.filter(sname__contains="小") startswith和endswith:以values開頭或者結尾的查詢,大小寫區分,例:students_list=Students.stuobj.filter(sname__startswith="小") 以上四個開頭加上i,就不區分大小寫,iexact,icontains,istartswiht,iendswith isnull,isnotnull:是否為空的意思,例:filter(sname_isnull=False) in:是否包含在範圍內,例:students_list=Students.stuobj.filter(pk__in=[2,4,6]) gt,gte,it,ite:分別為,大於,大於等於,小於,小於等於,例:students_list=Students.stuobj.filter(sage__gt=30) year,month,day,week_day,hour,minute,second:日期篩選,例:students_list=Students.stuobj.filter(latetime__year=2017) 跨關聯查詢: 處理join查詢,語法:模型類名__屬性名__比較運算符 描述中帶有"小李"這兩個字的數據是屬於那個班級的 students_list = Grades.gra_guanli.filter(students__scontend__contains=‘小李‘) print(students_list) 查詢快捷: pk --- 代表主鍵 聚合函數: 使用aggregate()函數返回聚合函數的值 Aug Count Max Min Sum 使用時候,需要先引入,例,取最大的年齡: from django.db.models import Max studentAge = Students.stuobj.aggregate(Max(‘sage‘)) print studentAge 列印結果:{‘sage__max‘: 34} #是個字典 F對象: 可以使用模型A屬性與B屬性進行比較 也是需要先引入 from django.db.models import F def grades3(request): g = Grades.gra_guanli.filter(ggirlnum__gt=F(‘gboynum‘)) print(g) return HttpResponse("kkk") 支持F對象的算術運算 g = Grades.gra_guanli.filter(ggirlnum__gt=F(‘gboynum‘)+20) Q對象: 概述:過濾器的方法中的關鍵字參數,條件為AND模式 需求:進行or查詢 解決:使用Q對象,這個是或的關係,只兩個條件有一個符合都會顯示 from django.db.models import Q def studentsearch(request): g = Students.stuobj.filter(Q(pk__gt=7) | Q(sage__gt=30)) print (g) return HttpResponse(‘jj‘) 如果只有一個Q對象,就是用於匹配 g = Students.stuobj.filter(Q(pk__gt=7)) 如果Q對象前面再個波浪線,就是用於取反 g = Students.stuobj.filter(~Q(pk__gt=7)) 如果更改django的代碼,終端需要重新進入,並重新載入下麵,終端區分大小寫 from xinapp.models import Grades,Students from django.utils import timezone from datetime import * 查所有數據 類名.objects.all() 給表傳數據 grade1 = Grades() grade1.gname = "pingguo" grade1.gdate = datetime(year=2017,month=7,day=17) grade1.ggirlnum = 8 grade1.gboynum = 30 grade1.save() ..... 查詢數據某一個數據 類名.objects.get(pk=num) Grades.objects.get(pk = 2) #相當於id = 2 修改某一個表的數據 模型對象.屬性=新值 grade1.gboynum =80 grade1.save() 刪除某個表的數據 模型對象.delete() 物理刪除(資料庫中表的數據真實被刪除) grade2.delete() 關聯外鍵(註意,表中的欄位都必須賦值才能正常保存,否則會出錯) grade1 = Grades() grade1.gname = "ceshi" stu = Students() stu.sname = "ksjdfk" stu.models.ForeignKey = grade1 獲取班級關聯的學生 模型對象名.關聯的類名小寫_set.all() grade1.students_set.all() 通過關聯直接創建學生(如果中文需要轉碼u‘中文‘,英文不用,它會直接存入資料庫,不需要使用save()) 並且直接屬於grade1的學生! stu3 = grade1.students_set.create(sname=u‘曾志偉‘,sgender=True,scontend=‘shuoming‘,sage=77) 啟動伺服器 python manage.py runserver mysql的命令視窗,這個是沒有區分大不小寫的 刪除除資料庫 drop database 表名; 資料庫名 創建資料庫 create database 表名; 資料庫名 展示所有資料庫名稱 show databases; 使用資料庫 use 數據名; 展示資料庫下麵的所有表名稱 show tables; 展示表的所有欄位結構 desc 項目_表名 查詢表的具體的內容 select * from 表名(例:xinapp_grades); django中資料庫基本操作: 1.同步資料庫 python manage.py makemigrations #生成migrations python manage.py migrate #應用migrations 2.增 Model.objects.create(**kwargs) 3.查 Model.objects.all() 4.改 m = Model.objects.get(id=1) m.name = ‘new_name‘ m.save() 5.刪 m = Model.objects.get(id=1) m.delete() 3.資料庫的基本操作 3.1 增 我們先為shopping mall增加一個化妝品區: 複製代碼 from django.shortcuts import HttpResponse from .models import Area def add_area(request): area = Area.objects.create(name=‘cosmetic‘, description=‘充滿香味兒的區域‘) return HttpResponse(‘added!‘) 複製代碼 其中,第六行代碼 area = Area.objects.create(name=‘cosmetic‘, description=‘充滿香味兒的區域‘) 所對應的mysql語句為: insert into shop_area(name,description) values(‘cosmetic‘,‘充滿香味兒的區域‘); 3.2 查 現在,我們來列出shopping mall中的所有區域: 複製代碼 1 from django.shortcuts import HttpResponse 2 from .models import Area 3 4 5 def list_area(request): 6 area = Area.objects.all() 7 print(area) # 在shell輸出[<Area: ‘cosmetic‘>],如果沒有定義__str__(),將輸出無意義的[<Area: Area object>] 8 9 return HttpResponse(‘listed!‘) 複製代碼 第六行代碼 area = Area.objects.all() 相當於mysql語句: select * from shop_area; 複習一下:shop_area為django為模型自動生成的表名(app_model) 3.3 改 在3.1中,我們並沒有為化妝品區指定管理人員。現在,我們修改化妝品區的信息,將rinka指定為管理人員。 首先,我們要創建一個rinka用戶。這裡我將創建一個名為rinka的superuser: python manage.py createsuperuser 接著,將我們創建的rinka用戶指定為化妝品區的管理人員: 複製代碼 1 from django.shortcuts import HttpResponse 2 from .models import Area 3 from django.contrib.auth.models import User 4 5 6 def update_area(request): 7 rinka = User.objects.get(username=‘rinka‘) 8 area = Area.objects.get(id=1) 9 area.manager = rinka 10 area.save() 11 12 return HttpResponse(‘updated!‘) 複製代碼 註意必須調用對象的save()方法,對對象實例的修改才會保存到資料庫中去。這是一個容易出錯的地方。 第8~10行代碼對應的mysql語句為: update shop_area set manager_id=1 where id=1; 複習一下:manager_id為django預設為外鍵生成的列名(foreignkey_id) 3.4刪 刪除操作很簡單,我們現在來刪除資料庫表shop_area中id為1的那行數據: 複製代碼 1 from django.shortcuts import HttpResponse 2 from .models import Area 3 4 5 def delete_area(request): 6 area = Area.objects.get(id=1) 7 area.delete() 8 9 return HttpResponse(‘deleted!‘) 複製代碼 第6~7行語句對應的mysql語句為: delete from shop_area where id=1; 模型類中定元選項(Meta類): db_talbe 定義數據表名,如果不定義, 預設是項目名小寫_類名小寫 ordering 取數據時顯示的順充 正數為順序,前面加負號為反序,排序會增加資料庫資源 class Meta: db_table="students" ordering=["-id"] """