1

私がすることができます:

counter = 0

class A(models.Model):
  code = models.IntegerField(max_length=30, default=generate_code)

def generate_code():
  counter += 1
  return counter

しかし、インスタンスの作成時ではなく、モデル クラスの初期化 (ロード) 中に割り当てが行われるように思われるため、'code' は常に '1' です。

モデル クラスのインスタンスの作成中に、動的な値をフィールドに自動的に割り当てるにはどうすればよいですか?

次のように、オーバーライドされた関数に値を設定すると__init__:

class A(models.Model):

    def __init__(self, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.code = self.generate_code()

コードは更新ごとに変更されます。デバッガーが表示 __init__するように、オブジェクトを削除すると関数も呼び出されます。私は本当にこれを理解していません!

設定されていない場合は、関数にのみコードを設定できますが、__init__それは非論理的であるように思われるので、避けたいと思います。

4

1 に答える 1

1

データベース内の各 A オブジェクトに一意のカウンター値があることを確認する方法を探しているだけですか? AutoField次に、代わりに使用できますIntegerField: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.AutoField

新しいAオブジェクトを作成すると、そのcounter値は以前に作成された値よりも 1 大きい値に自動的に設定されます。

あなたが見ている動作のいくつかを説明するために、models.py がロードされるたびに、実際に新しいcounter変数を 0 に初期化します。コンストラクターが予期しないときに呼び出される理由は、データベースからのデータを表すクラスにすぎAません。Aしたがって、Django がデータベースからデータを取得して表示するたびに、Aそのデータをカプセル化する新しいオブジェクトが作成されます。

于 2012-12-12T23:32:13.150 に答える