django 過濾器-查詢集-比較運算符-FQ對象-mysql的命令窗口

"""
返回查詢集的方法稱爲過濾器
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"]




"""
相關文章
相關標籤/搜索