ManyToManyField 中間テーブルのカラム名

333 views
Skip to first unread message

otsuka

unread,
Nov 13, 2008, 2:40:17 PM11/13/08
to djan...@googlegroups.com
大塚と申します。

既存のデータベースからDjangoアプリケーションを構築しようと
しています。

単純な多対多の関連を示すモデルを定義する場合に、
ManyToManyFieldを使用しますが、db_table引数で中間
テーブルのテーブル名は指定できるものの、ドキュメントを
読む限り中間テーブルに定義されているカラム名は指定
できないようです。
そのためDjangoが想定するカラム名と既存テーブルのカラム名
とが食い違ってしまう状況です。(他のアプリケーションからも
このDBを使っているため、カラム名の変更は避けたい)

中間テーブルに外部キー以外のカラムはないのですが、
このような場合はドキュメントの「多対多を定義するためのエクストラ
フィールド」で説明されているように through引数を使って
中間モデルを用意するしかないでしょうか?

Takashi Matsuo

unread,
Nov 13, 2008, 5:57:56 PM11/13/08
to djan...@googlegroups.com
2008/11/14 otsuka <t.ot...@gmail.com>:

through を使うと色々機能が制限されるとも書いてありますね。試してないの
で恐縮なのですが、DB側でカラム名をDjangoが想定してるように変えたviewを
作成し、そのviewを中間テーブルとして使えばうまくいったりしませんでしょ
うか。

--
Takashi Matsuo

tokibito

unread,
Nov 14, 2008, 4:38:04 AM11/14/08
to django-ja
岡野です。

ManyToManyFieldのソースを読んでみました。

_m2m_column_name_cache
_m2m_reverse_name_cache

にカラム名を保持しているようなので、
あまりスマートな方法ではないかもしれませんが、
ManyToManyFieldを継承してこれを書き換えるようにしてみてはいかがでしょうか?

良くある事例なので後で試してみようかな・・・

otsuka

unread,
Nov 14, 2008, 5:54:59 AM11/14/08
to djan...@googlegroups.com
大塚です。

Matsuoさん、岡野さん、ありがとうございます。

なるほど、viewを使う方法は考えられますね。
レコードの挿入や更新を考えると更新可能なviewを用意しないと
いけないので、ちょっと敷居が高まっちゃいますね。

> _m2m_column_name_cache
> _m2m_reverse_name_cache
>
> にカラム名を保持しているようなので、
> あまりスマートな方法ではないかもしれませんが、
> ManyToManyFieldを継承してこれを書き換えるようにしてみてはいかがでしょうか?

そんな方法もあるんですね。

頑張ってDBのカラム名を変更する方向を考えていたのですが、
参考になりました。いずれかの方法でやってみたいと思います。

Reply all
Reply to author
Forward
0 new messages