""" 返回查詢集的方法稱爲過濾器 all() 返回查詢集中全部數據 filter() 返回符合條件的數據 1、filter(鍵=值) 2、filter(鍵=值,鍵=值) #兩個關係爲and 3、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"] """