2015-01-05 81 views
0

比方說,我有一個稱爲Orders的模型,它具有字段'date'作爲DateField,其中index_db = True。order_by vs. django模型中的聚合

給定一個日期,我想查找訂單中該日期的最近記錄。

我可以這樣寫:

prev_orders = Orders.objects.filter(date__lte=date).order_by('-date') 
last_order = prev_orders[0] 

或:

from django.db.models import Max 
max_date = Orders.objects.filter(date__lte=date).aggregate(Max('date'))['date__max'] 
last_order = Orders.objects.get(date=max_date) 

哪一個是更快?還有其他什麼理由可以選擇另一個?

回答

1
Orders.objects.filter(date__lte=date).order_by('-date')[0] 

顯然是一個更快的,在後一種情況下,你ORMing兩次計算的東西比你更需要..

第一個是足夠好..

1
prev_orders = Orders.objects.filter(date__lte=date).order_by('-date').first() 

first()吞導致異常並返回無如果queryset不返回對象。如果您試圖從空的查詢集索引[0]獲取元素,Python應該引發錯誤。