2013-07-13 61 views
1

每張發票可能有多個項目,發票到期日是最早到期項目的日期。這裏就是我有,但我不知道是否有可能是一個較短的版本:這個日期檢查有更簡潔嗎?

due_date = None 

for item in i.item_set.all(): 
    if due_date is None: 
     due_date = item.due_date 
    else: 
     if due_date > item.due_date: 
      due_date = item.due_date 
+0

你們是不是要直接從數據庫或通過一個查詢集循環得到你的答案(在Python讓你的答案)? –

+0

@BrianNeal我認爲來自Python的速度越來越快。 –

+1

這取決於。如果你只是想知道一件事,那麼使數據庫做這項工作可以快幾個數量級。爲了讓您在Python中獲得答案,Django的ORM必須將所有數據都帶入內存並構造對象,從而節省時間和內存。 –

回答

3

由於您使用的Django,你可以做這樣的:

invoice_date = i.item_set.order_by('due_date')[0].due_date 
+1

您可能想用try/catch來包圍它,如果沒有項目,則將值設置爲None。 –

3

你試過min

due_date = min((item.due_date for item in i.item_set.all())) 

或者,另一種選擇:

from operator import attrgetter 
due_date = min(i.item_set.all(), key=attrgetter("due_date")).due_date 

希望有所幫助。

+1

請注意,後者有所不同,你會得到一個項目對象,而不是隻是due_date ... –

+0

感謝您指出。 – alecxe

相關問題