values ()
in Django ORM stecken geblieben istDjango ORM hat ähnliche Methoden, "
Der Grund dafür ist, dass ich beim Schreiben eines Codes wie ↓ den folgenden Fehler erhalten habe.
president1 = Company.objects.values(*fields)[0].president
# =>Error: AttributeError: 'dict' object has no attribute 'president'
Hier aus dem Modell Company
unter Verwendung der values ()
Methode von Django ORM,
Ich versuche, den Wert des Feldes "Präsident" des ersten Elements eines Abfragesatzes (wie einer Python-Liste mit einem iterierbaren Datentyp, der mehrere Objekte enthält) zu ermitteln, indem nur ein bestimmtes Feld extrahiert wird ..
Zur Laufzeit bekam ich jedoch den Fehler `AttributeError: 'dict' Objekt hat kein Attribut 'President'.
Selbst nachdem ich die Modelldefinition überprüft hatte, stellte ich fest, dass das Feld "Präsident" existiert, aber das ist seltsam. Unterschied zwischen values () und only () war hilfreich.
values ()
gibt ValuesQuerySet
anstelle von QuerySet
zurückGemäß dem Referenzartikel gibt die Methode "values ()" ein Objekt vom Datentyp "ValuesQuerySet" zurück.
Basierend auf QuerySet
gibt es ** so etwas wie ein Array von Elementen zurück, die aus Objektfeldern in ein Wörterbuch (= ValuesQuerySet) ** konvertiert wurden.
Mit anderen Worten, im obigen Code habe ich versucht, Felddaten aus dem Wörterbuch "{" Präsident ":" xxx ", ...}" mit ".president" abzurufen, sodass eine Fehlermeldung angezeigt wurde.
Da es sich um ein Wörterbuch handelt, bedeutet die Verwendung von "[" Präsident "]", dass kein Fehler aufgetreten ist. Wenn Sie die Fehlermeldung lesen, heißt es "Objekt diktieren". ..
only ()
gibt QuerySet
zurückWenn Sie also wie in diesem Fall "Query Set" möchten, können Sie "only ()" [^ 1] verwenden. Dieses Mal ist das Element kein Wörterbuch, aber eine Instanz der Klasse wird ordnungsgemäß zurückgegeben, sodass kein Fehler auftritt.
Übrigens ist "QuerySet" iterierbar, aber seien Sie vorsichtig, da sich der Datentyp von "list" unterscheidet (weil er ähnlich ist, werde ich manchmal süchtig).
Wenn ein Abfragesatz in eine Liste konvertiert wird, kann er mit ** list (QuerySet object)
** konvertiert werden.
[^ 1]: Es können nur angegebene Felder extrahiert werden. Wird zur Leistungsoptimierung verwendet. Umgekehrt können Sie defer ()
verwenden, um das angegebene Feld auszuschließen.
Recommended Posts