2

私は OpenERP 環境で作業していますが、私の問題は純粋な python の観点から答えられるかもしれません。私がやろうとしているのは、それぞれの辞書を返す関数から「_columns」変数を設定できるクラスを定義することです。だから基本的に:

class repos_report(osv.osv):
    _name = "repos.report"
    _description = "Reposition"
    _auto = False

    def _get_dyna_cols(self):
        ret = {}
        cr = self.cr
        cr.execute('Select ... From ...')
        pass           #<- Fill dictionary
        return ret

    _columns = _get_dyna_cols()

    def init(self, cr):
        pass    #Other stuff here too, but I need to set my _columns before as per openerp 

repos_report()

私は多くの方法を試しましたが、これらのコードは私の基本的なニーズを反映しています。インストールのためにモジュールを実行すると、次のエラーが発生します。

TypeError: _get_dyna_cols() takes exactly 1 argument (0 given)

関数を定義するとき、最初のパラメーターとして_get_dyna_cols必要です(実行前であっても)。selfまた、データを照会して _columns 辞書を埋めるために、openerp の「cr」カーソルへの参照が必要です。では、この関数をどのように呼び出して、に割り当てることができます_columnsか? この関数にどのパラメータを渡すことができますか?

OpenERP の観点から、私は自分の必要性を非常に明確にしたと思います。したがって、提案された他のアプローチも大歓迎です。

4

2 に答える 2

4

OpenERP の観点からは、適切なソリューションは実際に何をしようとしているのかによって異なりますが、それはあなたの説明からは明確ではありません。通常、_columnsモデルの定義は静的でなければなりません。これは、モデルが ORM によってイントロスペクトされ、(とりわけ) 対応するデータベース列が作成されるためです。_columnsモデルの__init__メソッド ( init1ではない) に を設定することもできますが、結果は時間の経過とともに変化してはならないため、あまり意味がありません (また、モデル レジストリが初期化されるときに 1 回だけ呼び出されます)。

現在、「静的列」ルールにはいくつかの例外があります。

機能フィールド

仮想列で読み取り/書き込み操作を動的に処理するだけの場合は、単純にそのfields.function型の列を使用できます。他のフィールド タイプの 1 つをエミュレートする必要がありますが、データに対して必要なことは何でも動的に行うことができます。典型的な例では、いくつかの前処理の後、データを他の (実際の) 列に格納します。公式の OpenERP モジュールには何百もの例があります。

動的列セット

TransientModelウィザード モデル (以前の のサブクラスosv_memory) を開発している場合、通常はデータベース ストレージを気にせず、単にユーザーから入力を取得して対応するアクションを実行したいだけです。その場合、モデルが使用されるたびに列の数とタイプが変わる完全に動的な列のセットが必要になることは珍しくありません。これは、いくつかの主要な API メソッドをオーバーライドして動的列をシミュレートすることで実現できます`:

  • fields_view_getモデルのビュー (フォーム/ツリー/...) の定義を取得するためにクライアントによって呼び出される API メソッドです。
  • fields_getの結果に含まれますが、個別に呼び出すことができ、モデルの列定義をfields_view_get含む を返します。dict
  • searchreadwriteおよびcreateは、レコード データにアクセスして更新するためにクライアントによって呼び出され、の結果で定義された列の値を適切に受け入れるか返す必要があります。fields_get

これらのメソッドを適切にオーバーライドすることで、動的列を完全に実装できますが、実際の静的列または他のモデルで、API の動作を維持し、データ (存在する場合) の永続性を自分で処理する必要があります。

公式アドオンには、このような動的列セットの例がいくつかあります。たとえばsurvey、調査キャンペーンの定義に基づいて調査フォームをシミュレートする必要があるモジュールなどです。

1このinit()メソッドは、このモデルのデータベース バックエンドをセットアップ/更新するために、モデルのモジュールがインストールまたは更新されたときにのみ呼び出されます。これは に依存して_columnsいます。

于 2012-10-10T10:13:50.173 に答える