1. 程式人生 > 其它 >Django objects.all()、objects.get()與objects.filter()之間的區別介紹

Django objects.all()、objects.get()與objects.filter()之間的區別介紹

objects.all()返回的是個QuerySet物件,程式並沒有真的在資料庫中執行SQL語句查詢資料,但支援迭代,使用for迴圈可以獲取資料。

In [1]: from index.models import *

In [2]: v = Vocation.objects.all()

In [3]: v
Out[3]: <QuerySet [<Vocation: 2>, <Vocation: 3>, <Vocation: 5>, <Vocation: 7>, <Vocation: 8>, <Vocation: 11>, <Vocation: 12>]>

In [4]: for i i v:
   ...:     print(i.job)
  File "<ipython-input-4-5b967446af21>", line 1
    for i i v:
          ^
SyntaxError: invalid syntax


In [5]: for i in v:
   ...:     print(i.job)
   ...: 
文員
網站設計
專案經理
jj
zz
aa1
aa2

get返回的是Model物件,型別為列表,說明使用get方法會直接執行sql語句獲取資料

In [6]: v = Vocation.objects.get(id=2)

In [7]: v
Out[7]: <Vocation: 2>

In [8]: v.job
Out[8]: '文員'

filter和get類似,但支援更強大的查詢功能,同時返回的也是個查詢集,查詢集不能直接使用屬性。

In [9]: v = Vocation.objects.filter(id=2)

In [10]: v
Out[10]: <QuerySet [<Vocation: 2>]>
In [13]: v.job
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-b87bc0c3b499> in <module>
----> 1 v.job

AttributeError: 'QuerySet' object has no attribute 'job'

In [14]: v[0].id
Out[14]: 2

使用get方法查詢返回的是單個欄位<Vocation: 2>,查詢欄位必須是主鍵或者唯一約束的欄位,並且查詢的資料必須存在,若重複或不存在則報錯
使用filter方式查詢,返回的是個列表<QuerySet [<Vocation: 2>]>
相關連結:
https://www.cnblogs.com/wkhzwmr/p/15589934.html

努力拼搏吧,不要害怕,不要去規劃,不要迷茫。但你一定要在路上一直的走下去,儘管可能停滯不前,但也要走。