2012-07-25 50 views
0

我有一個模型,我做一個查詢:Django的查詢上的查詢集性能

my_objects = Model.objects.filter(user = request.user) 

現在在my_objects我做:

obj = my_objects.get(user = x) 

我想了解,如果我的不用彷徨 over my_objects不會生成對數據庫的另一個查詢,並且只能在篩選器輸出上工作?或者它會產生另一個查詢。

回答

1

如果Model心不是用戶實例,它會再次命中數據庫,因爲用戶在這種情況下是相關的對象,如果你不想再次命中數據庫,使用select_related()和filter自己obj

「會自動‘跟隨’外鍵關係,選擇該 其他相關對象數據時,它執行查詢的」

my_objects = Model.objects.select_related().filter(user = request.user) 

在這裏看到更多的信息: https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

編輯: 我忘了提,查詢集Django的是懶惰的,直到你評估查詢集居然不打分貝,這些都是強制評估查詢集方法: methods

+0

什麼會發生如果我的第一個.filter是(user = request.user),但我的第二個.get是在不同的非相關對象?它會再次擊中分貝嗎? – 2012-07-25 14:16:39

+0

是的,你正在創建另一個查詢集,最好是你自己的過濾器對象 new_obj = [obj obj在my_objects中如果obj.some_value ==「some_value」] 這比讓django ORM過濾器對象更好。 看我編輯 – levi 2012-07-25 16:25:31

+0

很奇怪。不太明白django queryset中爲什麼沒有這樣的東西... – 2012-07-25 18:53:10