Django中object.all
前言
先拋出一個(gè)問題。銀行就相當(dāng)于一個(gè)數(shù)據(jù)庫(kù),你去銀行取錢存錢辦卡銷卡,是你告訴銀行柜員方便還是你自己去操作電腦辦卡取卡方便?(你還不一定會(huì),假設(shè)自動(dòng)存款機(jī)還沒發(fā)明),object在數(shù)據(jù)庫(kù)中就相當(dāng)于銀行里得銀行柜員。
步入正題:
在django中的view.py中,我們可能回經(jīng)常見到? book_set= Book.objects.all(),book_list = Book.objects.get()?
讓我們疑惑的問題是,objects是個(gè)什么東西,book_set 和book_list 又是個(gè)神馬東西?
object是Manager類型的對(duì)象,定義在from django.db import models中,是默認(rèn)生成的,也就是objects = Modes.Manage() 。用途是數(shù)據(jù)庫(kù)和模型對(duì)象交互的接口(api)。book_set返回的是個(gè)集合,book_list返回的是個(gè)列表。book =?Book.objects.all(),這個(gè)翻譯成銀行得話就是,一個(gè)叫BOOK得人來(lái)到銀行,通過一個(gè)名叫objects得柜員,查詢BOOK得銀行余額和銀行卡信息,結(jié)果得到一個(gè)queryset對(duì)象
在book =BOOK.objects.get()或者book = BOOK.objects.all()中
- BOOK是類名,就是你在model中創(chuàng)建的類
- objects是django默認(rèn)的管理器對(duì)象,就是剛才的比喻中的銀行柜員,幫你完成各種操作。
- get()或者all()是API,一種內(nèi)置函數(shù),也就是比喻鐘銀行柜員可以幫助我們完成的各種具體業(yè)務(wù),不同的業(yè)務(wù)調(diào)用不同的API就可以了。
- book通過all()得到的就是要給queryset()對(duì)象,也就是查詢對(duì)象集合。
一,QuerySet 對(duì)象的創(chuàng)建方法
>> from blog.models import Blog >>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.') >>> b.save()總之,一共有四種方法 # 方法 1 Author.objects.create(name="WeizhongTu", email="tuweizhong@163.com")# 方法 2 twz = Author(name="WeizhongTu", email="tuweizhong@163.com") twz.save()# 方法 3 twz = Author() twz.name="WeizhongTu" twz.email="tuweizhong@163.com" twz.save()# 方法 4,首先嘗試獲取,不存在就創(chuàng)建,可以防止重復(fù) Author.objects.get_or_create(name="WeizhongTu", email="tuweizhong@163.com") # 返回值(object, True/False)備注:前三種方法返回的都是對(duì)應(yīng)的 object,最后一種方法返回的是一個(gè)元組,(object, True/False),創(chuàng)建時(shí)返回 True, 已經(jīng)存在時(shí)返回 False
對(duì)比得知,object這個(gè)管理器對(duì)象幫了我們很多忙,我們不用實(shí)例化對(duì)象,不用save(),而是交給Author.object去實(shí)現(xiàn)。
舉個(gè)例子吧,如果我們把數(shù)據(jù)庫(kù)比作銀行,那么object對(duì)象就相當(dāng)于柜員,能幫助你處理各種業(yè)務(wù)。如果沒有得話,去銀行取錢,我們得自己登記,自己去金庫(kù)拿錢,記賬,鎖門.........不太現(xiàn)實(shí)吧。同理,你去數(shù)據(jù)庫(kù)取個(gè)數(shù)據(jù),沒有objects對(duì)象,是不是很麻煩?
其實(shí)換個(gè)角度來(lái)講,你去銀行辦理得一些業(yè)務(wù),是銀行柜員幫你在銀行得數(shù)據(jù)庫(kù)里進(jìn)行得增刪改查操作,銀行柜員得名字可以叫object(默認(rèn)得名字),當(dāng)然也可以叫小李,小王,不過你得自定義罷了。xiaoli = models.Manage()也是可以得。
你看看,此時(shí)此刻,有沒有認(rèn)識(shí)到,一切皆對(duì)象,這個(gè)面向?qū)ο缶幊痰脗ゴ笾帯?/p>
二,Django中查詢常用的API
# 查詢相關(guān)API:# <1>filter(**kwargs): 它包含了與所給篩選條件相匹配的對(duì)象# <2>all(): 查詢所有結(jié)果# <3>get(**kwargs): 返回與所給篩選條件相匹配的對(duì)象,返回結(jié)果有且只有一個(gè),如果符合篩選條件的對(duì)象超過一個(gè)或者沒有都會(huì)拋出錯(cuò)誤。#-----------下面的方法都是對(duì)查詢的結(jié)果再進(jìn)行處理:比如 objects.filter.values()--------# <4>values(*field): 返回一個(gè)ValueQuerySet——一個(gè)特殊的QuerySet,運(yùn)行后得到的并不是一系列 model的實(shí)例化對(duì)象,而是一個(gè)可迭代的字典序列# <5>exclude(**kwargs): 它包含了與所給篩選條件不匹配的對(duì)象# <6>order_by(*field): 對(duì)查詢結(jié)果排序# <7>reverse(): 對(duì)查詢結(jié)果反向排序# <8>distinct(): 從返回結(jié)果中剔除重復(fù)紀(jì)錄# <9>values_list(*field): 它與values()非常相似,它返回的是一個(gè)元組序列,values返回的是一個(gè)字典序列# <10>count(): 返回?cái)?shù)據(jù)庫(kù)中匹配查詢(QuerySet)的對(duì)象數(shù)量。# <11>first(): 返回第一條記錄# <12>last(): 返回最后一條記錄# <13>exists(): 如果QuerySet包含數(shù)據(jù),就返回True,否則返回False。另外關(guān)于ApI,給大家推薦一篇不錯(cuò)得文章
https://blog.csdn.net/cumtdeyurenjie/article/details/80211896
總結(jié)
以上是生活随笔為你收集整理的Django中object.all的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xxx/ASPNET帐户登陆失败情况处理
- 下一篇: Maven dependency plu