9

私は最近自分のコードでタイプミスをして、同じ動作をしていることに気づいたので、django クエリでの単一アンダースコアと二重アンダースコアの違いは何だろうと思っていました。

>>> underscore = MyModel.objects.filter(foreign_key_id=var)
>>> double_underscore =  MyModel.objects.filter(foreign_key__id=var)
>>> underscore == double_underscore
False
>>> list(underscore) == list(double_underscore)
True

クエリセットを比較するためにどの等価メソッドが使用されているかはわかりませんが、Python リストに変換すると、まったく同じ要素が含まれていることがわかります。誰かがここで何が起こっているのかについて洞察を持っていますか?

4

3 に答える 3

12

これらの 2 つのフィールドは、たまたま両方が存在します。

foreign_key_idMyModelはオブジェクトに自動的に作成される列foreign_key__idですが、 は外部キー テーブル自体の ID です。

これらの値は両方とも同じです..

MyModel1.foreign_key_id == 5  # this is stored on the model
                              # and does not require a lookup.
MyModel1.foreign_key.id == 5  # this is stored on the target table
                              # and requires a DB hit. 
于 2013-02-18T21:06:50.840 に答える
1

foreign_key_idは の (隠し) フィールド名MyModelforeign_key__idはフィールドが参照するモデルのforeign_keyフィールドへの参照です。つまり、外部キー フィールドの特定の詳細です。

于 2013-02-18T21:07:33.607 に答える