2016-09-09 7 views
1

私はFフィールドを探索するために単純なDjangoモデルを作成しましたが、フィールド上で反復することができました。Django Fフィールド反復

class PostgreSQLModel(models.Model): 
    class Meta: 
     abstract = True 
     required_db_vendor = 'postgresql' 

class NullableIntegerArrayModel(PostgreSQLModel): 
    field = ArrayField(models.IntegerField(), blank=True, null=True)  

私のdjangoシェルから、私は以下のようなFオブジェクトを作成しました。このオブジェクトには何が含まれているかわかりません。すべてのIDを含んでいますか?どのように結果を反復処理できますか?

>>> 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'] 

答えて

2

Fはフィールドではありません。

F()オブジェクトは、モデルフィールドまたは注釈付きの列の値を表します。モデルフィールドの値を参照し、実際にデータベースからPythonメモリにプルする必要なしに、モデルフィールド値を参照してデータベース操作を実行することができます。 - F() expressions

要約すると、クエリで別のフィールドの値を参照する必要があるときはいつでも、 F()オブジェクトを使用します。それ自体では、 F()オブジェクトは何も意味しません。それらは同じクエリーセットのフィールド値を参照するために使用されます。あなたは field値が2倍に idここでオブジェクトを照会する場合

例(非常に簡単な例)の場合は、お使いのモデルでは、フィルタリングしながら、あなたはreference id field's valueする必要がありますので、あなたは、このようなF()使用できます。

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

F('id')は、単にそのモデルのid値を参照します。 Djangoはそれを使って対応するSQL文を作成します。この場合、このような何か:F()表現なし

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

あなたの生のSQLを書いたり(オブジェクトがたくさんある、特にパフォーマンスが低下します)Pythonでフィルタリングを行うだろうどちらか。


参照:

F()クラス定義から:

referencを解決することのできるオブジェクト既存のクエリオブジェクトに追加します。 - F source

+0

素晴らしい答えです。あなたが気にしないなら、私はこれをクリーンアップして、Djangoのドキュメンテーションセクションで使うことができると思います:http://stackoverflow.com/documentation/django/topics –

+0

@Brewmaster確かに問題はありません。 –

関連する問題