[解決済み] Django モデルフィールドのデフォルトは、同じモデル内の別のフィールドに基づく
質問
被験者の名前とイニシャルを含むモデルがあります(データは多少匿名化され、イニシャルで追跡されます)。
今、私は
class Subject(models.Model):
name = models.CharField("Name", max_length=30)
def subject_initials(self):
return ''.join(map(lambda x: '' if len(x)==0 else x[0],
self.name.split(' ')))
# Next line is what I want to do (or something equivalent), but doesn't work with
# NameError: name 'self' is not defined
subject_init = models.CharField("Subject Initials", max_length=5, default=self.subject_initials)
最後の行にあるように、私はイニシャルを (名前とは無関係の) フィールドとして実際にデータベースに格納できるようにしたいのですが、それは名前フィールドに基づくデフォルト値で初期化されます。 しかし、django のモデルには 'self' がないようなので、問題があります。
この行を
subject_init = models.CharField("Subject initials", max_length=2, default=subject_initials)
に変更すると、syncdbはできますが、新しいsubjectを作成することができません。
Django で、呼び出し可能な関数が他のフィールドの値に基づいてあるフィールドにデフォルトを与えるということは可能でしょうか?
(不思議なことに、私がストアのイニシャルを別々に分けたい理由は、稀なケースとして、奇妙な姓が私が追跡しているものと異なる場合があるからです。 たとえば、他の誰かが Subject 1 Named "John O'Mallory" のイニシャルが "JO" ではなく "JM" であると判断し、管理者としてそれを修正編集したいと考えています)。
どのように解決するのですか?
モデルには確かに "self" があります! モデル クラスの属性をモデル インスタンスに依存するものとして定義しようとしているだけです。クラスとその属性を定義する前にインスタンスが存在しない (存在しえない) ので、それは不可能です。
望む効果を得るために、モデルクラスのsave()メソッドをオーバーライドします。 インスタンスに必要な変更を加えてから、スーパークラスのメソッドを呼び出して実際の保存を行います。 以下は簡単な例です。
def save(self, *args, **kwargs):
if not self.subject_init:
self.subject_init = self.subject_initials()
super(Subject, self).save(*args, **kwargs)
これは モデルメソッドのオーバーライド で説明されています。
関連
-
[解決済み] Django のカスタムフィールドで User モデルを拡張する
-
[解決済み] Django Model() vs Model.objects.create()
-
[解決済み】Djangoはデフォルトのフォーム値を設定する
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Pythonの文字列書式をリストで使う