Was genau ist das "QuerySet" -Objekt in Mongoengine?

8

Gemäß dem Mongoengine-API-Leitfaden ( Ссылка ):

%Vor%

ist " eine Reihe von Ergebnissen, die von einer Abfrage zurückgegeben werden. Wraps eines MongoDB-Cursors, wobei Document-Objekte als Ergebnisse bereitgestellt werden. "

Wenn ich das QuerySet-Objekt mit type() in meinem Interpreter begutachte, heißt das, dass das QuerySet-Objekt in Übereinstimmung mit dem API-Guide ein <class 'mongoengine.queryset.QuerySet'> ist.

Ich bin aber verwirrt, weil ich, um tatsächlich auf die einzelnen Mongoengine Document -Objekte in der QuerySet-Instanz zuzugreifen, Indexmethoden wie [0] (für das erste Document -Objekt) oder [2] ( für das dritte Objekt Document ) Siehe diese SO-Frage zum Aufteilen eines QuerySets . Interessanterweise können Sie len() auch für eine QuerySet-Instanz aufrufen.

Obwohl QuerySet ein Klassenobjekt ist, warum scheint es sich wie ein Listenobjekt zu verhalten? Soweit ich das beurteilen kann, erbt es nicht von UserList und hat kein data -Attribut. Jede Hilfe würde sehr geschätzt werden.

Danke.

BEARBEITEN:

Danke für Ihren Vorschlag @isbadawi. Das ist hilfreich. Das Klassenobjekt QuerySet enthält in der Tat die Methode __getitem__ , die, wie Ihr Link andeutet, der Indexierung "ungefähr entspricht" (z. B. x.__getitem__(i) entspricht ungefähr x[i] ). Wenn also QuerySet eine Listenklasse über __getitem__ emuliert, wo werden die tatsächlichen Document -Objekte in der Klasse gespeichert? In einem Attribut? Dies ist die Ausgabe von dir(QuerySet) in meinem Interpreter:

%Vor%     
yuningalexliu 01.03.2013, 04:00
quelle

1 Antwort

6

Wie in zu sehen ist, ist der Code QuerySet eine Art Abstraktion über pymongo cursor . Daher gibt es keinen Speicher innerhalb von QuerySet .

Beim Aufruf von len() QuerySet.__len__ wird die magic-Methode aufgerufen, die das Ergebnis von self.count() zurückgibt, das die Anzahl vom Cursor abfragt.

Und so weiter. QuerySet.__getitem__ fragt den Cursor nach dem entsprechenden Element, QuerySet.first macht dasselbe.

Ich rate dringend dazu, in den Code zu schauen, wenn Sie Zweifel haben, wie die Dinge intern implementiert werden.

    
lig 01.03.2013 06:22
quelle