4

私はこれを理解し、モデルフィールドのキーワードself内への参照を行う方法を考え出すのに問題を抱えていました:default

ここに私が持っているものがあります:

class Bank(models.Model):
    number = models.CharField(max_length=10)

class Account(models.Model):
    bank = models.ForeignKey(Bank, related_name="accounts")
    number = models.CharField(max_length=20)
    created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User)
    # This is the guy
    special_code = models.CharField(max_length=30, default='%s-%s' % (self.number, self.bank.number))

そのため、クラス定義内で self にアクセスしようとしていますが、まだオブジェクトではないため、python は self がどこにあるかを認識していないため、うまくいかないようです。

私は次のようなさまざまなことを試しました:

special_code = models.CharField(max_length=30, default='%s-%s' % (number, bank.number))

しかし、この場合bank.number、銀行は の唯一のプロパティであるため、認識されませんmodels.ForeignKey

Accountクラス内のメソッドも使用してみました:

def bank_number(self):
    return self.bank.number

その後:

special_code = models.CharField(max_length=30, default='%s-%s' % (number, bank_number()))

まだ自己が必要なので、それはちょっとばかげていました。これを行う方法はありますか?

データベース内に番号を保存する必要があるため、次のような方法を使用しても役に立ちません。

def special_number(self):
    return '%s-%s' % (self.number, self.bank.number)
4

3 に答える 3

6

デフォルトの callable で self にアクセスする方法はないと思います。フィールドの値を設定するには、他にもいくつかの方法があります。

ユーザーが値を変更できないようにする場合は、モデルの save メソッドをオーバーライドして、そこに設定します。

デフォルトが単なる提案であり、ユーザーがそれを変更できるようにしたい場合は、モデル フォームの__init__メソッドをオーバーライドしてから、self.instance にアクセスし、フィールドの初期値を変更することができます。

于 2012-11-14T20:24:23.790 に答える
3

フィールドのデフォルトを指定する代わりに、メソッドをオーバーライドしてsave()、オブジェクトをデータベースに格納する直前にフィールドにデータを入力することをお勧めします。このsave()メソッドは にもアクセスできますself。そのためのドキュメントの例を次に示します。

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

于 2012-11-14T20:25:03.387 に答える
2

すでに回答したようsave()に、モデルのメソッドをオーバーライドして、に値を割り当てますspecial_code。フィールドのdefaultオプションは、モデルの他のフィールドに依存することを意図していないため、これは機能しません。

また、editableフィールドを編集したくない場合は、オプションを確認してください。

special_code = models.CharField(max_length=30, editable=False)

モデルから作成したModelFormsでフィールドがレンダリングされないようにします。

于 2012-11-14T20:31:10.213 に答える