2011-05-13 46 views
5

當我這樣做Django的ORM,打DB

objects = Model.objects.all()

然後

II。 objects.filter(field_1=some_condition)

我每次在有不同條件的第2步時都打db。有什麼方法可以在第一步操作中獲取所有數據,然後處理結果?

回答

9

你實際上沒有打到分貝,直到你評估的QS,查詢是lazy

閱讀全文here

編輯:

後重新閱讀你的問題很明顯你問如何防止DB命中爲不同條件過濾時。

​​

通常你會希望數據庫爲你做過濾。

您可以通過將qs轉換爲列表來強制對qs進行評估。這會阻止進一步的db命中,但它可能會比讓db返回結果更糟。

qs_l = list(qs) 
qs1_l = [element for element in qs_l if element.some_field='some_value'] 
qs2_l = [element for element in qs_l if element.some_field='some_other_value'] 
+0

謝謝你的一個問題。我可以在不將QuerySet轉換爲列表的情況下打db?或者,也許我可以將列表轉換回QuerySet? – alexvassel 2011-05-13 10:27:09

+0

您無法將列表轉換爲查詢集。你可以通過幾種方式擊打db,他們被列在DTing答案的第二個鏈接中。 – DrTyrsa 2011-05-13 10:30:22

+0

您可以通過「Read more here」鏈接中提到的方法命中db,例如迭代,分區切片等。這個答案http://stackoverflow.com/questions/1058135/django-convert-a-list-back-to-a-queryset/1058152#1058152和相關的問題可能是有趣的您。 – DTing 2011-05-13 10:32:11

1

你爲什麼不做objs = Model.objects.filter(field=condition)?也就是說,一旦執行了SQL查詢,就可以使用Python表達式進行進一步的過濾/處理,而不會產生額外的數據庫命中。

2

當然你每次都會打db。 filter()轉換爲您的數據庫執行的SQL語句,您不能打filter。因此,您可以使用values()list(Model.objects.all())檢索所需的所有對象,並按照zeekay的建議,使用Python表達式(如列表解析)進行額外的篩選。

+0

這是不正確的。檢查答案中的鏈接:http://stackoverflow.com/a/5989752/4213969 – Vladimir 2016-02-27 18:08:54