10

根据 Mongoengine API 指南(http://mongoengine-odm.readthedocs.org/en/latest/apireference.html):

class mongoengine.queryset.QuerySet(document, collection)

是“从查询返回的一组结果。包装一个 MongoDB 游标,提供 Document 对象作为结果。

当我type()在解释器中检查 QuerySet 对象时,它说 QuerySet 对象是 a <class 'mongoengine.queryset.QuerySet'>,与 API 指南一致。

我很困惑,因为为了实际访问DocumentQuerySet 实例中的单个 Mongoengine 对象,我必须使用索引方法,如 [0](对于第一个Document对象)或 [2](对于第三个Document对象)见这个 SO question关于切片 QuerySet。有趣的是,您还可以调用len()QuerySet 实例。

即使 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']
4

1 回答 1

6

从代码 中可以看出,这QuerySet是对 pymongo 的一种抽象cursor。因此里面没有存储QuerySet

当您调用len() QuerySet.__len__魔术方法时,将调用返回self.count()从游标询问计数的结果。

等等。QuerySet.__getitem__询问光标对应的项目,QuerySet.first做同样的事情。

当您怀疑事情是如何在内部实现时,我强烈建议您查看代码。

于 2013-03-01T06:22:30.577 回答