Djangoで混乱しているのは、モデルのフィールドの仕組みです。モデルでdjangosフィールドのインスタンスが動作する方法
これらをクラス変数として定義します。
ので、このようなクラス:
class Foo:
avar = "something here"
そして、あなたは2つのインスタンスを作成した場合。
f1 = Foo()
f2 = Foo()
そして、あなたが何か他のものであることをAVARを設定し、これはFoo
の両方のインスタンスに影響を与えます。だから、djangoはインスタンス間のモデルフィールド値をどのように正確に保つのでしょうか?単純に基本クラス変数を使用してテーブルを作成した後、それぞれのインスタンスの正しいフィールド値を返すようにモデル/テーブルのデータベースをクエリしますか?
モデルを__init__
/__new__
と言うまで、メタクラスレベルで作成を延期するようなことをして、フィールドの一意のインスタンスを作成しますか?
amodel = AModel.objects.get(*)
のようなものDjangoがデータベースにヒットして、おそらくモデルのクラスのインスタンスを返すことがわかりました。フィールドの値が入力されているので、amodel.field
にアクセスできました。値正しく。これは理にかなっていますが、私はこの仕事の内部がどのように理解されているかわかりません。
:あなたは、インスタンスの変数を削除すると、値が戻って(現在の)クラス変数の値に戻ります。 2つの別々のモデルインスタンスを作成しました。それらは別々のプロパティを持つ別々のオブジェクトであり、保存する場合はデータベース内の別の行です。 – solarissmoke
'models.Model'内部の仕組みを知りたければ' path/to/site-packages/django/db/models/base.py'のコードを 'class Model'で調べることができます。 – allcaps
@solarissmoke OPが持つものは、* instance *属性ではなく* class *属性です。オブジェクトは文字列なので、実際には関係ありません。つまり、 'avar'に代入すると、class属性を変更する代わりにローカル変数に名前が再バインドされます。しかし、 'avar'が何か変更可能であった場合、これは重要な違いです。だから、fluffy_muffin: 'avar'の設定は両方のオブジェクトに影響するとは思いません。 'Foo.avar'を設定しない限り、なぜあなたはそれをしますか? –