2015-01-21 44 views
2

我有一個在Django開發環境下訪問數據庫的模型。我希望做的事:查詢中的Django問題

Friends.objects.filter(pk__contains=str)[:20].filter(invite_id=77) 

但我得到這個錯誤:

File "<console>", line 1, in <module> 
File "D:\INSTALL\Python\lib\site-packages\django\db\models\query.py", line 691 
, in filter 
return self._filter_or_exclude(False, *args, **kwargs) 
File "D:\INSTALL\Python\lib\site-packages\django\db\models\query.py", line 703 
, in _filter_or_exclude 
"Cannot filter a query once a slice has been taken." 

查詢一次後,我已經有20個項目。爲什麼我不能通過查詢再次獲取物品?

注意:我瞭解錯誤,但我想再次查詢。這肯定不是一個好主意,因爲我得到了錯誤。誰知道更好的方法?

回答

1

您必須限制返回結果的數量應用過濾器。這是SQL如何工作(WHERELIMIT前):

Friends.objects.filter(invite_id=77)[:20] 
+0

這有不同的效果,我怎麼解釋原代碼。這將找到前20個匹配對象,而不是前20個對象中的所有匹配項。我不確定哪些是需要的。 – Holloway 2015-01-21 11:32:20

+0

確實如此,但是在限制結果後實施過濾器相當複雜。一些數據庫可以通過子查詢訪問,但不能訪問MySQL。唯一的數據庫獨立選項是Python端的實現,在I/O和CPU端會很昂貴。 – 2015-01-21 11:47:46

+0

@KlausD .:由於它只有20條記錄,因此實際上不需要讓數據庫完成這項工作。 '[f for Friends.objexts.all()[:20]如果f.invite_id == 77]'訣竅,在一個不太可能的情況下,這是OP真正想要的。 – 2015-01-21 12:05:10