2017-01-24 30 views
2

我有一個Django應用程序,其中有一些項目。每個項目可以有多個預算,並且每次向項目添加新預算時,該項目的現有預算都應該將其version_number加1。 「當前的預算應該是其version_number爲0〜所以其他地方的代碼試圖「獲得」當前預算使用的時候,我做的事情,如預算:Python-我如何從對象列表中獲取日期字段具有最新值的對象?

budgetInstance = Budget.objects.get(project = project, version_number = 0) 

然而,似乎不知何故,其中一些項目以budgets結束,其version_number爲0,所以看起來數據庫中的一些項目似乎有幾個「當前預算」...

我知道我需要以修復版本的完成邏輯,以便沒有兩個budgets可以有相同的version_number,但現在,我只想獲得最新的budget爲數據庫中的每個項目。

每個Budget對象具有的屬性,如:project_idversion_numberidpresentation_date

所以我現在要過濾的時候我過濾通過version_number = 0)通過presentation_date領域已返回budgets。據我瞭解,我會做到這一點使用min(),但我似乎無法得到這個工作...

我想在下面的接受的答案:Find oldest/youngest datetime object in a list,跑在shell下:

mostRecentBudget = min(date for date in budgets.dates if date < now) 

但我有一個TypeError,其中說:

TypeError: 'instancemethod' object is not iterable

這是爲什麼?如何在給定的Project中搜索Budgets的列表,查找具有最新presentation_date字段值的列表?

+0

您將需要提供更多信息。這裏的預算和預算是什麼?爲什麼你不能使用數據庫來訂購這個查詢? –

回答

4

您可以通過Date[Time]Fields__lt[e], __gt[e]date[time]對象進行過濾。然後,使用latest(field_name)

from django.utils import timezone 

now = timezone.datetime.now() 
Budget.objects.filter(
    project=project, version_number=0, 
    presentation_date__lte=now # p_d less than or equal now 
).latest('presentation_date') 

不像last,但非常喜歡get,這將引發一個ObjectDoesNotExist如果QuerySet是空的。

+0

嘿,謝謝你的回答。我收到了'DoesNotExist'錯誤信息,正如你提到的那樣,但我不知道爲什麼......?爲什麼查詢集是空的?如果我運行:'testPrjBdgtsv0 = testPrjBdgts.filter(version_number = 0)',然後'testPrjBdgtsv0',我得到以下輸出:'[<預算:測試1:版本0>,<預算:測試1:版本0> ,...]很清楚,查詢集不是空的......? – someone2088

+0

然後它不應該引發異常。你確定你打電話給最新的查詢集嗎?我的例子中的qs有更多的過濾器。 – schwobaseggl

+0

我的輸入方式與您在答案中所寫的內容完全相同,但輸入時出現了一些不尋常的情況:輸入__lte =後,光標移回到行的開頭,因此我繼續輸入'now'),這就是覆蓋在行首寫的內容...... – someone2088

相關問題