10

Mongoengine API ガイド ( http://mongoengine-odm.readthedocs.org/en/latest/apireference.html ) によると:

class mongoengine.queryset.QuerySet(document, collection)

クエリから返された一連の結果です。MongoDB カーソルをラップし、結果として Document オブジェクトを提供します。

type()インタープリターで使用して QuerySet オブジェクトを検査する<class 'mongoengine.queryset.QuerySet'>と、API ガイドに一致して、QuerySet オブジェクトは であると表示されます。

QuerySet インスタンスの個々の Mongoengine オブジェクトに実際にアクセスするには、[0] (最初のオブジェクトの場合) または [2] (3 番目のオブジェクトの場合)Documentのようなインデックス メソッドを使用する必要があるため、混乱しています。この SO の質問を参照してください。 QuerySet のスライスについて。興味深いことに、QuerySet インスタンスを呼び出すこともできます。 DocumentDocumentlen()

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

ありがとう。

編集:

@isbadawi さん、ご提案ありがとうございます。それは役に立ちます。__getitem__QuerySet クラスオブジェクトには、リンクが示唆するように、インデックス作成と「ほぼ同等」のメソッドが実際に含まれています(たとえば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']
4

1 に答える 1

6

コード に見られるQuerySetように、 pymongo に対する一種の抽象化ですcursor。したがって、内部にストレージはありませんQuerySet

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

等々。QuerySet.__getitem__カーソルに対応する項目を尋ねますQuerySet.first。同じことを行います。

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

于 2013-03-01T06:22:30.577 に答える