質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5857閲覧

ForeignKeyに、複数のモデルを設定したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2グッド

2クリップ

投稿2016/06/30 11:45

DjangoでWebアプリを作成しています。

データベース上に顧客情報を登録するにあたり、どのような構成にしたら良いかと悩んでいます。

顧客は、法人の場合もあり、個人の場合もあります。
そのため、案件毎に顧客を登録するにあたり、下記コードの、customer = ForeignKey()に、Company(法人)とPerson(個人)のどちらでも持って来れるようにしたいです。

python

1# models.py 2 3# 法人情報 4class Company(models.Model): 5 name = models.CharField(max_length=30) # 法人名 6 represetative = models.ForeignKey("Person", blank=True, null=True) # 法人の代表者 78 9# 個人情報 10class Person(models.Model): 11 name = models.CharField(max_length=30) # 個人名 1213 14# 案件情報 15class Work(models.Model): 16 name = models.CharField(max_length=50) #案件名 17 customer = models.ForeignKey() # ここの書き方で困っています。 18

上記のようなニーズがある場合はよくあるのではないかと思うのですが、一般的にどのように解決されることが多いのでしょうか。

お分かりの方、ご教示頂ければ幸いです。
よろしくお願いいたします。

av-, Youhei-Sakura👍を押しています

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

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

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

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

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

guest

回答2

0

最終的に、下記のコードで実現するようにしました。

CUSTOMER_CHOICES = (
(0, u'法人'),
(1, u'個人')
)

class Company(models.Model):
"""法人情報"""
name = models.CharField(max_length=30) # 法人名

class Person(models.Model):
"""個人情報"""
name = models.CharField(max_length=30) # 個人名

class Customer(models.Model):
"""顧客"""
customer_type = models.IntegerField(choices=CUSTOMER_CHOICES)
company = models.OneToOneField(Company, null=True)
person = models.ForeignKey(Person)

class Work(models.Model):
"""案件情報"""
name = models.CharField(max_length=50) # 案件名
customer = models.ForeignKey(Customer)

テーブルは増えていますが、法人・個人の違いをcustomerが吸収してくれるため、分かりやすいコードで実現できたと思います。

投稿2016/07/04 10:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

PolymetisOutis7

2022/04/03 07:01

私もForeignKeyで複数のモデルを候補にしたく取り組んでいます。 質問者様のやり方だと、実装してみたところ、Customerの項目で個人を選んでも会社名が必須項目になってしまいます。 それでも良いのでしょうか?
guest

0

ベストアンサー

一番単純な方法は generic foreign keyを使うことです。ただし色々制限があるのでその辺りは調べてから使ってください。 https://docs.djangoproject.com/ja/1.9/ref/contrib/contenttypes/

投稿2016/07/01 11:51

編集2016/07/01 11:52
podhmo

総合スコア29

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

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

退会済みユーザー

退会済みユーザー

2016/07/04 10:43

ご回答頂き、ありがとうございます。 ご教示頂いた、generic foreign keyでの方法も検討したのですが、最終的に、自己解決の方に書いたコードで実現することにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問