2013-03-01 4 views
8

Mongoengineの "QuerySet"オブジェクトは正確に何ですか? Mongoengine APIガイド(<a href="http://mongoengine-odm.readthedocs.org/en/latest/apireference.html" rel="nofollow noreferrer">http://mongoengine-odm.readthedocs.org/en/latest/apireference.html</a>)によれば

class mongoengine.queryset.QuerySet(document, collection) 

である

"結果のセットがクエリから返さ結果としてドキュメントオブジェクトを提供し、MongoDBのカーソルをラップ。"私は、インタプリタでtype()を使用してQuerySetオブジェクトを検査します.QualSetオブジェクトは<class 'mongoengine.queryset.QuerySet'>で、APIガイドと一致しています。

私は、QuerySetインスタンスの個々のMongoengine Documentオブジェクトに実際にアクセスするために、[0](最初のDocumentオブジェクトの場合)または[2](3番目の場合Documentオブジェクト)See this SO question about slicing a QuerySet。興味深いことに、QuerySetインスタンスでlen()を呼び出すこともできます。

QuerySetはクラスオブジェクトですが、リストオブジェクトのように振る舞うように見えるのはなぜですか?私が知る限り、それはUserListから継承されず、data属性を持たない。どんな助けでも大歓迎です。

ありがとうございました。

EDIT:あなたの提案@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 –

答えて

6

the codeQuerySetに見られるようにpymongo cursor以上の抽象化の一種です。したがって、QuerySetの中に保管場所はありません。

len()QuerySet.__len__と呼ぶと、self.count()の結果を返すマジックメソッドが呼び出され、カーソルからのカウントが返されます。

など。 QuerySet.__getitem__は対応する項目のカーソルを要求し、QuerySet.firstは同じことを行います。

内部的にどのように実装されているのか疑問に思うときは、このコードを調べることを強くお勧めします。

+1

は、pongongoのカーソルのmongoengine固有のラッパーです。これは、フィルタリング、更新などのドキュメントに対するグローバル操作を行うための特別なメソッドを追加します。クエリーセットのイテレータです。 – Ross

関連する問題