2016-09-09 9 views
1

Ich habe ein einfaches Django-Modell erstellt, um das F-Feld zu untersuchen, könnte aber über das Feld iterieren.Django F-Feld-Iteration

Nun, von meiner Django-Shell habe ich ein F-Objekt wie unten erstellt. Nicht sicher, was dieses Objekt enthält. Enthält es alle IDs? Wie kann ich über das Ergebnis iterieren?

>>> a=F('id') 
>>> a 
F(id) 
>>> dir(a) 
['ADD', 'BITAND', 'BITOR', 'DIV', 'MOD', 'MUL', 'POW', 'SUB', '__add__', '__and__', '__class__', '__delattr__', '__dict__', '__dir__', '__div__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__new__', '__or__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__weakref__', '_combine', 'asc', 'bitand', 'bitor', 'desc', 'name', 'resolve_expression'] 

Antwort

2

F ist kein Feld.

Ein F() - Objekt repräsentiert den Wert eines Modellfelds oder einer annotierten Spalte. Es ermöglicht, auf Modellfeldwerte zu verweisen und Datenbankoperationen mit diesen durchzuführen, ohne sie wirklich aus der Datenbank in den Python-Speicher ziehen zu müssen. - F() expressions

Zusammengefasst verwenden Sie F()-Objekte, wenn Sie einen anderen Feldwert in Ihren Abfragen verweisen müssen. Für sich selbst bedeutet F() Objekte nichts. Sie werden verwendet, um auf einen Feldwert in demselben Abfrage-Set zu verweisen.

Zum Beispiel (ein sehr einfaches Beispiel), in Ihrem Modell, wenn Sie Objekte abfragen möchten, wo field Wert ist das Doppelte seiner id, Sie reference id field's value brauchen würde, während Filterung, so dass Sie F() wie diese verwenden:

NullableIntegerArrayModel.objects.filter(field=F('id') *2) 

F('id') verweist einfach auf den Wert id für dieses Modell. Django verwendet es, um eine entsprechende SQL-Anweisung zu erstellen. In diesem Fall etwas wie folgt aus:

'SELECT "app_model"."id", "app_model"."field" FROM "app_model" 
WHERE "app_model"."field" = (("app_model"."id" * 2))' 

Ohne F() Ausdrücke würden Sie entweder schreiben Sie Ihre RAW-SQL oder tun, um die Filterung in Python (die vor allem die Leistung reduziert, wenn es viele Objekte sind).


Referenzen:

Von F() Klassendefinition:

Ein Objekt der Lage referenc lösen es zu vorhandenen Abfrageobjekten. - F source

+0

ehrfürchtige Antwort. Wenn es Ihnen nichts ausmacht, denke ich, dass dies im Django-Dokumentationsbereich bereinigt und verwendet werden könnte: http://stackoverflow.com/documentation/django/topics –

+0

@TheBrewmaster sicher überhaupt kein Problem. –

Verwandte Themen