🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

9062閲覧

【Django / Postgres】 ModelのIDに外部キーを設定すると、カラム名に _id が余分に付いてしまうのは仕様か。

azuapricot

総合スコア2341

pgAdmin

pgAdminは、オープンソースのPostgreSQL管理ツール。様々な機能を持ち、コマンドラインベースでPostgreSQLへ行う操作のほとんどをpgAdminを用いて実行することができます。

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/10/23 08:11

いつもお世話になっております。

早速本題に入らせていただきます。

Djangoで外部キーをIDに設定した際に、カラム名に_id という文字が余分に付属してしまうのが仕様かそうではないのかお聞きしたいです。

以下が現在のModelとPostgresDBのテーブル状況です。


Python

1""" MainMaster """ 2class MainMaster (models.Model): 3 class Meta: 4 db_table = 'main_master' 5 6 main_id = models.CharField(max_length=25, primary_key=True) 7 main_name = models.CharField(max_length=200)

** Postgres: MainMaster **

main_idmain_name
1メイン1

Python

1""" SubMaster """ 2class SubMaster (models.Model): 3 class Meta: 4 db_table = 'sub_master' 5 6 sub_id = models.CharField(max_length=25, primary_key=True) 7 main_id = models.ForeignKey(MainMaster, on_delete=models.CASCADE) 8 sub_name = models.CharField(max_length=200)

** Postgres: SubMaster **

sub_idmain_id_idsub_name
11サブ1

上記のように、SubMasterにMainMasterの外部キーを設定すると、pgAdmin4上で
main_idmain_id_idとなってしまいます。

このせいで、views.py でquerySetを取得する際に、以下のように検索しなければ値が取得できません。

Python

1query = MainMaster.objects.filter(main_id=sub.main_id_id)

外部キーをIDに設定すると _id が余分にカラム名に足されてしまうのはDjangoの仕様なのでしょうか。

それとも私の設定がおかしい為にこのような事象が起きているのでしょうか・・・。

お時間ある方で、Djangoの外部キー設定時の、この現象につきまして何かお心当たりがある方いらっしゃいましたらご助力頂けますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/23 08:13 編集

過去質問で見たような…あれはRubyだったかな。フレームワークの仕様でした。 どちらも私が回答できる言語ではないのでこちらに書きますが、以前に見たことがあるという報告まで。
azuapricot

2019/10/23 08:16

情報ありがとうございます! そういう仕様だと断言できれば 「main_id_id」でDB取得するのですが 断言できない以上少し不安で・・・。 過去質問も調べてみます、ありがとうございます!
guest

回答1

0

ベストアンサー

ドキュメントにそれらしきものがありました。
Database Representation

以下Google翻訳

背後で、Djangoはフィールド名に「_id」を追加してデータベース列名を作成します。上記の例では、Carモデルのデータベーステーブルにmanufacturer_id列があります。 (db_columnを指定することでこれを明示的に変更できます)ただし、カスタムSQLを作成しない限り、コードでデータベース列名を処理する必要はありません。モデルオブジェクトのフィールド名は常に処理します。

db_columnを指定してあげればよいと書いてあるので

python

1main_id = models.ForeignKey(MainMaster, db_column='main_id', on_delete=models.CASCADE)

とすればできそうな気がします。

投稿2019/10/23 09:55

mistn

総合スコア1191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuapricot

2019/10/23 10:10

うわああああ神様仏様回答者様ぁあああ! ありがとうございます・・・できました!! db_column で指定してあげたところ _id が付与されない期待通りのカラム名になりました!! ありがとうございます、助かりました・・・!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問