既存のデータベースからDjangoアプリケーションを構築しようと
しています。
単純な多対多の関連を示すモデルを定義する場合に、
ManyToManyFieldを使用しますが、db_table引数で中間
テーブルのテーブル名は指定できるものの、ドキュメントを
読む限り中間テーブルに定義されているカラム名は指定
できないようです。
そのためDjangoが想定するカラム名と既存テーブルのカラム名
とが食い違ってしまう状況です。(他のアプリケーションからも
このDBを使っているため、カラム名の変更は避けたい)
中間テーブルに外部キー以外のカラムはないのですが、
このような場合はドキュメントの「多対多を定義するためのエクストラ
フィールド」で説明されているように through引数を使って
中間モデルを用意するしかないでしょうか?
through を使うと色々機能が制限されるとも書いてありますね。試してないの
で恐縮なのですが、DB側でカラム名をDjangoが想定してるように変えたviewを
作成し、そのviewを中間テーブルとして使えばうまくいったりしませんでしょ
うか。
--
Takashi Matsuo
Matsuoさん、岡野さん、ありがとうございます。
なるほど、viewを使う方法は考えられますね。
レコードの挿入や更新を考えると更新可能なviewを用意しないと
いけないので、ちょっと敷居が高まっちゃいますね。
> _m2m_column_name_cache
> _m2m_reverse_name_cache
>
> にカラム名を保持しているようなので、
> あまりスマートな方法ではないかもしれませんが、
> ManyToManyFieldを継承してこれを書き換えるようにしてみてはいかがでしょうか?
そんな方法もあるんですね。
頑張ってDBのカラム名を変更する方向を考えていたのですが、
参考になりました。いずれかの方法でやってみたいと思います。