2013-03-01 59 views
8

按照Mongoengine API指南(http://mongoengine-odm.readthedocs.org/en/latest/apireference.html): 「一組結果的從查詢返回的包裝了的MongoDB光標,提供文檔對象作爲結果Mongoengine中的「QuerySet」對象究竟是什麼?

class mongoengine.queryset.QuerySet(document, collection) 

當我在我的解釋器中使用type()檢查QuerySet對象,它說QuerySet對象是<class 'mongoengine.queryset.QuerySet'>,與API指南一致。

我很困惑,但因爲以實際訪問的查詢集實例的個別Mongoengine Document目的,我必須使用索引的方法,如[0](用於第一Document對象)或[2](第三Document對象)See this SO question about slicing a QuerySet。有趣的是,你也可以在QuerySet實例上調用len()

即使QuerySet是一個類對象,爲什麼它看起來像一個列表對象?據我所知,它不會從UserList繼承,並且沒有data屬性。任何幫助將不勝感激。

謝謝。

編輯:

感謝您的建議@isbadawi。這很有幫助。 QuerySet類對象確實包含__getitem__方法,正如鏈接所示,該方法與索引「大致等效」(例如,x.__getitem__(i)大致相當於x[i])。所以如果QuerySet通過__getitem__來模擬一個列表類,那麼在該類中存儲的實際Document對象在哪裏?在屬性?這是dir(QuerySet)在我的翻譯輸出:

> ['_QuerySet__already_indexed', '_QuerySet__dereference', '__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__iter__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_as_pymongo', '_as_pymongo_coerce', '_build_index_spec', '_class_check', '_collection', '_collection_obj', '_cursor', '_cursor_args', '_cursor_obj', '_dereference', '_document', '_ensure_indexes', '_fields_to_dbfields', '_get_as_pymongo', '_get_scalar', '_hint', '_initial_query', '_item_frequencies_exec_js', '_item_frequencies_map_reduce', '_iter', '_limit', '_loaded_fields', '_lookup_field', '_mongo_query', '_ordering', '_query', '_query_obj', '_reset_already_indexed', '_scalar', '_skip', '_slave_okay', '_snapshot', '_sub_js_fields', '_timeout', '_transform_query', '_transform_update', '_translate_field_name', '_where_clause', 'all', 'all_fields', 'as_pymongo', 'average', 'clone', 'count', 'create', 'delete', 'distinct', 'ensure_index', 'exclude', 'exec_js', 'explain', 'fields', 'filter', 'first', 'get', 'get_or_create', 'hint', 'in_bulk', 'insert', 'item_frequencies', 'limit', 'map_reduce', 'next', 'only', 'order_by', 'rewind', 'scalar', 'select_related', 'skip', 'slave_okay', 'snapshot', 'sum', 'timeout', 'update', 'update_one', 'values_list', 'where', 'with_id'] 
+0

http://docs.python.org/2/reference/datamodel.html#special-method-names – 2013-03-01 04:16:58

回答

6

the codeQuerySet看到的是一種抽象的過度pymongo cursor。因此QuerySet內部沒有存儲。

當您致電len()QuerySet.__len__魔術方法被調用,返回從光標詢問計數的結果self.count()

依此類推。 QuerySet.__getitem__要求光標對應的項目,QuerySet.first也一樣。

我強烈建議您在懷疑內部如何實現這些事情時查看代碼。

+1

是正確的,它是pongongo光標的mongoengine特定包裝。它增加了對文檔進行全局操作的特殊方法,例如過濾,更新等。以及作爲查詢集的迭代器。 – Ross 2013-03-01 09:35:42