當我這樣做Django的ORM,打DB
一objects = Model.objects.all()
然後
II。 objects.filter(field_1=some_condition)
我每次在有不同條件的第2步時都打db。有什麼方法可以在第一步操作中獲取所有數據,然後處理結果?
當我這樣做Django的ORM,打DB
一objects = Model.objects.all()
然後
II。 objects.filter(field_1=some_condition)
我每次在有不同條件的第2步時都打db。有什麼方法可以在第一步操作中獲取所有數據,然後處理結果?
你實際上沒有打到分貝,直到你評估的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']
你爲什麼不做objs = Model.objects.filter(field=condition)
?也就是說,一旦執行了SQL查詢,就可以使用Python表達式進行進一步的過濾/處理,而不會產生額外的數據庫命中。
當然你每次都會打db。 filter()
轉換爲您的數據庫執行的SQL語句,您不能打filter
。因此,您可以使用values()
或list(Model.objects.all())
檢索所需的所有對象,並按照zeekay的建議,使用Python表達式(如列表解析)進行額外的篩選。
這是不正確的。檢查答案中的鏈接:http://stackoverflow.com/a/5989752/4213969 – Vladimir 2016-02-27 18:08:54
謝謝你的一個問題。我可以在不將QuerySet轉換爲列表的情況下打db?或者,也許我可以將列表轉換回QuerySet? – alexvassel 2011-05-13 10:27:09
您無法將列表轉換爲查詢集。你可以通過幾種方式擊打db,他們被列在DTing答案的第二個鏈接中。 – DrTyrsa 2011-05-13 10:30:22
您可以通過「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