2009-10-17 79 views
0

我想在使用django時減少實際的數據庫命中,所以我創建了這個人造示例來概述問題。該模型是這樣的:在django中消除不必要的數據庫命中

class Car(models.Model): 
    name = models.CharField(max_length=10) 
    user = models.ForeignKey(User) 

在我看來,我想要做這樣的事情:

def cartest(request): 
    cars = Car._default_manager.filter(user__username__exact='michael')[:5] 
    first_car_name = cars[0].name 
    another_car = cars[1] 
    return HttpResponse(len(connection.queries)) 

所以我想從數據庫中選擇5個條目,做一些與第一位的,然後做第二件事(記住這是一個人造的例子)。必須有一些方法來做到這一點,而不是兩次點擊數據庫,對嗎?

謝謝, 邁克

+0

啊,似乎是做我想要的,當我迭代'汽車',而不是試圖給它下標。 – 2009-10-17 07:11:57

回答

2

啊,想通了......這實現了預期的效果。問題是對queryset進行下標而不是遍歷它(或調用list(queryset))。只碰到數據庫一次:

def cartest(request): 
    cars = list(Car._default_manager.filter(user__username__exact='michael')[:5]) 
    first_car_name = car[0] 
    another_car = car[1] 
    return HttpResponse(len(connection.queries)) 
+0

實現同樣效果的一種更簡單的方法就是簡單地執行'cars = list(car._default_manager.filter(user__username__exact ='michael')[:5])' - 在查詢集上調用'list'評估它。 – 2009-10-17 08:19:15

+0

完美。更新我的答案。謝謝。 – 2009-10-17 17:09:56

1

你實際運行的性能問題,在這一點上還是你只是關心你的應用程序的未來可擴展性?

由於蒂姆沃德爾說得很好previously,不要試圖過早優化。利用已保存的開發時間,Django可以讓您更快地將您的應用程序推出市場。一旦你有用戶,然後看看你的瓶頸,並試圖修復它們。

但是,如果您實際遇到了性能問題,我將查看Queryset的能力以獲取update multiple objects at once並獲取數據in bulk

至少有one rejected ticket我知道這可能會幫助你(取決於你的數據庫系統)。

您總是可以將Django的ORM拉出來,並用SQLAlchemy替換它。

This post(可能NSFW)有一些關於製作高性能Django應用程序的指針。

詹姆斯貝內特總體上有一些關於縮放的好處,其中一些是關於ORM performance

+0

謝謝,沒有性能問題...我只是覺得2或3數據庫命中,當你只需要1是錯誤的腳下車。找出如何獲得預期的效果,請參閱上面的註釋。謝謝,-Mike – 2009-10-17 07:16:18

相關問題