django數(shù)據(jù)查詢

數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查詢集API 參...
    陽光小鎮(zhèn)少爺閱讀 3,958評論 0 8
  • Django 1.8.2 文檔Home | Table of contents | Index | Modules...
    軒轅小愛閱讀 2,425評論 0 2
  • 數(shù)據(jù)庫基本操作(查詢) 一、查詢對象 從數(shù)據(jù)庫里檢索對象,可以通過模型的Manage來建立QuerySet,一個Q...
    唯老閱讀 860評論 0 6
  • 模塊間聯(lián)系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。軟件設(shè)計中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,218評論 0 8
  • 寫大字的時候,我們大多數(shù)同學找來細木棒削好了,蘸了墨汁,隨性地寫。所謂墨汁,也是用手在自家的鍋底刮了一些鍋灰,用水...
    青葦暖陽閱讀 379評論 0 5

友情鏈接更多精彩內(nèi)容