2009-08-10 68 views
26

道歉,我對Django和Python完全陌生。Django - 獲取創建的最後一個對象,併發過濾器

我有2個問題。首先,我將如何去獲取對象列表中創建的最後一個對象(或最高PK)?例如,我知道我可以使用以下來獲得第一個對象:

list = List.objects.all()[0] 

有沒有辦法獲得List.objects的長度?我試過List.objects.length但無濟於事。

其次,是否可以創建同時過濾器或組合列表?這裏有一個例子:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number) 

我想要的東西,像上面的,而更像是:

def findNumber(request, number) 
    phone_list = Numbers.objects.filter(cell=number or home_phone=number) 

什麼是正確的語法,如果有的話?

回答

42

我沒有試過,但我想看看latest()操作上QuerySets

最新(FIELD_NAME =無)

返回最新的對象在 表,按日期使用作爲日期字段提供的字段名稱 。

此示例返回表的最新條目 ,根據 PUB_DATE領域:

Entry.objects.latest( 'PUB_DATE')

如果模型的元指定 get_latest_by,你可以請將 field_name參數設置爲latest()。 默認情況下,Django將使用在 get_latest_by中指定的字段。

Like get(),latest()引發 DoesNotExist如果對象不存在 存在給定的參數。

注意latest()純粹用於 方便性和可讀性。

而且model docs on get_latest_by

get_latest_by

Options.get_latest_by

將DateField或DateTimeField字段在模型的名稱。這指定了您的模型管理器最新方法中使用的默認字段。

實施例:

get_latest_by = 「order_date的」

查看最新的文檔()的更多。

編輯:韋德在Q()運算符上有一個很好的答案。

+0

謝謝,休!我也會研究這一點。 – zdyn 2009-08-10 18:08:35

+0

真棒答案=)謝謝! – 2011-05-01 19:57:03

+0

@hughdbrown我們如何使用最新的Django模板? – MegaBytes 2016-03-08 05:56:31

12

對於最大的主鍵,試試這個:

List.objects.order_by('-pk')[0] 

注意,使用pk作品無論定義爲您的主鍵字段的實際名稱。

20

這個工程!

Model.objects.latest('field') - 字段可以是id。這將是最新的ID

+8

看起來有點像我在你四個月前寫的答案,不是嗎? – hughdbrown 2010-10-12 18:52:37

+4

你們並沒有真正激發我的信心,我還沒有嘗試過這種做法。這個答案是。 – 2016-04-17 19:36:23

0

替代用於創建的最新對象:

List.objects.all()[List.objects.count()-1] 

情況下必須有列表中沒有的項目添加一個AssertionError的情況。

except AssertionError: 
    ... 
+2

這將加載數據庫中的所有模型。 – wieczorek1990 2016-07-22 14:32:07

9

由於Django的1.6 - 最後

last()

作品像first(),但返回的查詢集的最後一個對象。

返回查詢集匹配的最後一個對象,如果沒有匹配對象則返回None。如果QuerySet沒有定義的順序,那麼查詢集由主鍵自動排序。

list = List.objects.last()爲您提供了創建

0

我工作的Django版本的最後一個對象是1.4.22,既不last也不lastet工作。 我與最低分貝裝載解決辦法是這樣的:

latest = lambda model_objects, field : model_objects.values_list(field, flat = True).order_by("-" + field)[ 0 ] 
latest_pk = latest(List.objects, "pk") 

這個函數接受query_set作爲輸入。

您可以做動態綁定此功能:

import types 
List.objects.latest = types.MethodType(latest, List.objects) 

那麼你應該能夠很容易地獲得這個最新的PK的最後一個對象。