2013-03-01 18 views
8

Zgodnie z wytycznymi Mongoengine API (http://mongoengine-odm.readthedocs.org/en/latest/apireference.html):. „zestaw zwróconych wyników z zapytania Okłady kursora MongoDB, zapewniając przedmiotów dokumencie jako wynikiCzym dokładnie jest obiekt "QuerySet" w Mongoengine?

class mongoengine.queryset.QuerySet(document, collection) 

jest

Kiedy Sprawdzam obiekt QuerySet przy użyciu type() w moim tłumaczu, mówi, że obiekt QuerySet jest <class 'mongoengine.queryset.QuerySet'>, w porozumieniu z przewodnikiem API.

mi zmieszany że ponieważ aby rzeczywiście uzyskać dostęp do poszczególnych Mongoengine Document przedmiotów na przykład queryset, trzeba stosować metody, takie jak indeks [0] (dla pierwszego Document obiektu) lub [2] (w odniesieniu do trzeciej Document obiekt) See this SO question about slicing a QuerySet. Co ciekawe, można również wywołać len() w instancji QuerySet.

Nawet jeśli QuerySet jest obiektem klasy, dlaczego zachowuje się jak obiekt listy? O ile wiem, nie dziedziczy po UserList i nie ma atrybutu data. Każda pomoc będzie bardzo ceniona.

Dzięki.

EDIT:

Dzięki za sugestię @isbadawi. To jest pomocne. Obiekt klasy QuerySet rzeczywiście zawiera metodę __getitem__, która, jak sugeruje twoje łącze, jest "mniej więcej równoważna" indeksowaniu (np. x.__getitem__(i) jest mniej więcej równoważne). Więc jeśli QuerySet emuluje klasę list przez __getitem__, gdzie są przechowywane rzeczywiste obiekty Document w klasie? W atrybucie? Jest to wyjście dir(QuerySet) w moim tłumacza:

> ['_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 –

Odpowiedz

6

Jak widać w the codeQuerySet to rodzaj abstrakcji nad pymongo cursor. W związku z tym nie ma żadnego magazynu wewnątrz QuerySet.

Po wywołaniu len()QuerySet.__len__ wywoływana jest metoda magic zwracająca wynik self.count(), która prosi licznik o kursor.

I tak dalej. QuerySet.__getitem__ prosi kursor o odpowiedni element, QuerySet.first zrobić to samo.

Zdecydowanie radzę zajrzeć do kodu, gdy masz wątpliwości, jak rzeczy są zaimplementowane wewnętrznie.

+1

jest poprawny, to specyficzne opakowanie monopodstawki kursora pymongo. Dodaje specjalne metody wykonywania operacji globalnych na dokumentach, takich jak filtrowanie, aktualizowanie itp. Nie tylko jest to iterator dla zapytań. – Ross