2011-08-13 6 views
2

私は徐々にレガシーデータベースのフロントエンドをdjangoベースのシステムに置き換えています。すべてのモデルは、元のDB構造を維持するために、Managed = Falseです。レガシーデータベースのDjangoとComputedフィールド

しかし、テーブルのフィールドが計算されるという問題が発生しました。このフィールドは、(擬似)sqlとしてfull_name = fnameとして定義されています。 || lname。

私はfull_nameフィールドをcharfieldとして定義できます。私はそれを問題なく読むことができますが、レコードを更新しようとすると、そのフィールドに更新エラーが発生します。

@propertyを使用できます。 db自身の結果を表示するのではなく、djangoの機能を複製します。このアプローチを使用すると、UDFで定義されているより複雑なフィールド(まだ取り組んでいないテーブル)で問題が発生します。

本当に必要なのは、モデル自体の 'read_only'または 'computed'属性です。これを達成する最善の方法は何ですか?

答えて

0

クラスにメソッドを定義したいだけですか?ような何か:

def Person(models.Model): 
    fname=models.CharField(...) 
    lname=models.CharField(...) 

    def fullname(self): 
    return self.fname+" "+self.lname 

(= Falseの手段を管理まさにわからない...)

+0

うーん...動作しますが、それはPythonコードからの回答を生成します。これは上の例ではうまくいきますが、DB(UDF、または 'ユーザ定義関数')用に書かれたC++ライブラリを使用して作成されたより複雑なフィールドはありません。 Managed = Falseは、モデル定義の変更がデータベース表btw .../p – patrickf

+0

を変更するのを停止します。おそらく、関連するSQLを構築して実行するいくつかのメソッド(私のフルネームのような)を記述する必要があります。実行はdjangoのドキュメントにあります。だから、それはどんな種類のxxxFieldでもないでしょう。 – Spacedman

+0

おそらく私の質問ではっきりしていません...私はそれが正しいタイプであると定義すると値を取得するのに問題はありません。しかし、もし私がそれを行うならば、それはデータベース自体によって計算されるフィールドであるので、モデルはフィールドを更新することができます。したがって、モデルには「このフィールドを選択できますが、INSERTまたはUPDATEはできません」と伝え、生成されたSQLからフィールドを削除する必要があります。 – patrickf

関連する問題