數(shù)據(jù)查詢
要從數(shù)據(jù)庫檢索數(shù)據(jù),首先要獲取一個查詢集**(QuerySet),查詢集表示從數(shù)據(jù)庫獲取的對象集合,它可以有零個,一個或多個過濾器。返回查詢集的方法,稱為過濾器,過濾器根據(jù)給定的參數(shù)縮小查詢結(jié)果范圍,相當于sql語句中where或limit。
在管理器上調(diào)用過濾器方法會返回查詢集
查詢集經(jīng)過過濾器篩選后返回新的查詢集,因此可以寫成鏈式過濾
惰性執(zhí)行:創(chuàng)建查詢集不會帶來任何數(shù)據(jù)庫的訪問,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫
以下對查詢集求值:迭代、切片、序列化、與if合用、repr()/print()/len()/list()/bool()
管理器的方法 返回類型 說明
模型類.objects.aggregate(Avg('price'), Max('price'), Min('price')) 平均值,最大, 最小
模型類.values_list('number', flat=True) values_list可以獲取number的元組列表,加個參數(shù)flat=True可以獲取number的值列表。
模型類.objects.all() QuerySet 返回表中所有數(shù)據(jù)
模型類.objects.filter() QuerySet 返回符合條件的數(shù)據(jù)
模型類.objects.exclude() QuerySet 返回不符合條件的數(shù)據(jù)
模型類.objects.order_by() QuerySet 對查詢結(jié)果集進行排序
模型類.objects.values() QuerySet 返回一個列表 每個元素為一個字典
模型類.objects.reverse() QuerySet 對排序的結(jié)果反轉(zhuǎn)
模型類.objects.get() 模型對象 返回一個滿足條件的對象;
如果沒有找到符合條件的對象,會引發(fā)模型類.DoesNotExist異常;
如果找到多個,會引發(fā)模型類.MultiObjectsReturned 異常
模型類.objects.count() int 返回查詢集中對象的數(shù)目
模型類.objects.first() 模型對象 返回第一條數(shù)據(jù)
模型類.objects.last() 模型對象 返回最后一條數(shù)據(jù)
模型類.objects.exists() bool 判斷查詢的數(shù)據(jù)是否存在
模型類.objects.update_or_create() 數(shù)據(jù)存在更新, 否則創(chuàng)建新一條新
模型類.objects.filter(node_ip=ip,hddname=hddname).update(temp=1) 更新數(shù)據(jù)
Users.objects.filter(id = 1).update(temp=None) 更新temp字段為null
Users.objects.exclude(name="") exclude反向查。這里是查詢字段不為空的。
5.2.1 返回查詢集
all()
更新 user='admin'并且uid=11的數(shù)據(jù) 如果沒有則創(chuàng)建一條 ,更新的數(shù)據(jù)為defaults;
django 官網(wǎng):https://docs.djangoproject.com/en/2.1/ref/models/querysets/
User.objects.update_or_create(
defaults=user_dict,
user='admin',
uid=11)
獲取所有數(shù)據(jù),對應SQL:select * from User
User.objects.all()
filter(**kwargs) 返回QuerySet包含與給定查找參數(shù)匹配的新查詢集。
等價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)
鏈式調(diào)用,等價于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)
參數(shù)是字段名,可以有多個字段名,默認是升序。
如果要按某個字段降序,在字段名前加’-’: "-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()
返回數(shù)據(jù):
[{'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的元組列表,加個參數(shù)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() 只匹配一條數(shù)據(jù)
u = User.objects.get(pk=1) #正常
u = User.objects.get(uid__gt=20) #MultipleObjectsReturned 匹配到了多條數(shù)據(jù)
u = User.objects.get(uid__lt=-1) #DoesNotExist 匹配失敗
first()和last()
User.objects.all().first() #返回結(jié)果集中第一條數(shù)據(jù)
User.objects.all().last() #返回結(jié)果集中最后一條數(shù)據(jù)
count()
返回結(jié)果集記錄數(shù)目,等價于select count(*)
不會返回整個結(jié)果集,相比len方法更有效
User.objects.count()
exists()
判斷查詢集中是否有記錄,有返回True,否則返回False
User.objects.filter(uid=3).exists()
5.2.3查詢集限制
查詢集類似列表,可以使用下標進行限制,類似sql語句中的limit子句。但索引不能是負數(shù)
索引
切片
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