數據查詢
要從數據庫檢索數據捏卓,首先要獲取一個查詢集**(QuerySet)榜配,查詢集表示從數據庫獲取的對象集合否纬,它可以有零個,一個或多個過濾器蛋褥。返回查詢集的方法临燃,稱為過濾器,過濾器根據給定的參數縮小查詢結果范圍,相當于sql語句中where或limit膜廊。
在管理器上調用過濾器方法會返回查詢集
查詢集經過過濾器篩選后返回新的查詢集乏沸,因此可以寫成鏈式過濾
惰性執(zhí)行:創(chuàng)建查詢集不會帶來任何數據庫的訪問,直到調用數據時爪瓜,才會訪問數據庫
以下對查詢集求值:迭代蹬跃、切片、序列化铆铆、與if合用蝶缀、repr()/print()/len()/list()/bool()
管理器的方法 返回類型 說明
模型類.objects.aggregate(Avg('price'), Max('price'), Min('price')) 平均值,最大算灸, 最小
模型類.values_list('number', flat=True) values_list可以獲取number的元組列表扼劈,加個參數flat=True可以獲取number的值列表。
模型類.objects.all() QuerySet 返回表中所有數據
模型類.objects.filter() QuerySet 返回符合條件的數據
模型類.objects.exclude() QuerySet 返回不符合條件的數據
模型類.objects.order_by() QuerySet 對查詢結果集進行排序
模型類.objects.values() QuerySet 返回一個列表 每個元素為一個字典
模型類.objects.reverse() QuerySet 對排序的結果反轉
模型類.objects.get() 模型對象 返回一個滿足條件的對象菲驴;
如果沒有找到符合條件的對象荐吵,會引發(fā)模型類.DoesNotExist異常;
如果找到多個,會引發(fā)模型類.MultiObjectsReturned 異常
模型類.objects.count() int 返回查詢集中對象的數目
模型類.objects.first() 模型對象 返回第一條數據
模型類.objects.last() 模型對象 返回最后一條數據
模型類.objects.exists() bool 判斷查詢的數據是否存在
模型類.objects.update_or_create() 數據存在更新赊瞬, 否則創(chuàng)建新一條新
模型類.objects.filter(node_ip=ip,hddname=hddname).update(temp=1) 更新數據
Users.objects.filter(id = 1).update(temp=None) 更新temp字段為null
Users.objects.exclude(name="") exclude反向查先煎。這里是查詢字段不為空的。
5.2.1 返回查詢集
all()
更新 user='admin'并且uid=11的數據 如果沒有則創(chuàng)建一條 巧涧,更新的數據為defaults;
django 官網:https://docs.djangoproject.com/en/2.1/ref/models/querysets/
User.objects.update_or_create(
defaults=user_dict,
user='admin',
uid=11)
獲取所有數據薯蝎,對應SQL:select * from User
User.objects.all()
filter(**kwargs) 返回QuerySet包含與給定查找參數匹配的新查詢集。
等價sql:select * from User
User.objects.filter()
等價sql:select * from User where uname = 'admin'
User.objects.filter(uname='admin')
等級sql:select * from User where uid > 1 and type = 2
User.objects.filter(uid__gt=1,type=2)
鏈式調用谤绳,等價于User.objects.filter(uid__gt=1,type=2)
User.objects.filter(uid__gt=1).filter(type=2)
exclude(**kwargs)
不匹配占锯,對應SQL:select * from User where name != 'admin'
User.objects.exclude(name='admin')
order_by(*fields)
參數是字段名,可以有多個字段名缩筛,默認是升序消略。
如果要按某個字段降序,在字段名前加’-’: "-uid"表示按uid降序排列
按uid升序排列 等價于 order by uid
User.objects().order_by('uid')
按uid降序排列 等價于 order by uid desc
User.objects.order_by('-uid')
多列排序 等價于 order by password,uid desc
User.objects.order_by('password','-uid')
values()
返回所有字段
User.objects.values()
返回數據:
[{'uid': 2, 'uname': '小甜甜', 'password': '59f2443a4317918ce29ad28a14e1bdb7'type': '普通用戶', 'regtime': None, 'ip': None, 'allowed': '允許登錄', 'email': None, None},...]
返回指定字段
User.objects.values('uname','password')
[{'uname': '小甜甜', 'password': '59f2443a4317918ce29ad28a14e1bdb7'},...]
reverse()
模型類.values_list('number', flat=True) values_list可以獲取number的元組列表瞎抛,加個參數flat=True可以獲取number的值列表艺演。
In [1]: from apps.dormitory.models import Building
In [2]: buildings = Building.objects.values('number')
In [3]: buildings
Out[3]: [{'number': u'1'}, {'number': u'2'}, {'number': u'3'}, {'number': u'4'}, {'number': u'5'}]
In [4]: buildings_ = Building.objects.values_list('number')
In [5]: buildings_
Out[5]: [(u'1',), (u'2',), (u'3',), (u'4',), (u'5',)]
In [6]: buildings_list = Building.objects.values_list('number', flat=True)
In [7]: buildings_list
Out[7]: [u'1', u'2', u'3', u'4', u'5']
User.objects.order_by('id').reverse() 降序
User.objects.order_by('-id').reverse() 升序
distinct() 去重
User.objects.values('password').distinct()
?
5.2.2 返回單個值
下面這些方法后面不能再跟其他過濾方法,因為他們不返回查詢集
get() 只匹配一條數據
u = User.objects.get(pk=1) #正常
u = User.objects.get(uid__gt=20) #MultipleObjectsReturned 匹配到了多條數據
u = User.objects.get(uid__lt=-1) #DoesNotExist 匹配失敗
first()和last()
User.objects.all().first() #返回結果集中第一條數據
User.objects.all().last() #返回結果集中最后一條數據
count()
返回結果集記錄數目桐臊,等價于select count(*)
不會返回整個結果集胎撤,相比len方法更有效
User.objects.count()
exists()
判斷查詢集中是否有記錄,有返回True断凶,否則返回False
User.objects.filter(uid=3).exists()
5.2.3查詢集限制
查詢集類似列表伤提,可以使用下標進行限制,類似sql語句中的limit子句懒浮。但索引不能是負數
索引
切片
User.objects.all()[0] #等同于:limit 0,1
User.objects.all()[2] #等同于:limit 2,1
User.objects.all()[0:2] #等同于limit 2
User.objects.all()[:2] #等同于limit 2
User.objects.all()[::2]
統(tǒng)計:
# 導入Avg模塊
from django.db.models import Avg
Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}
原文:https://blog.csdn.net/chen1042246612/article/details/84071006