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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

6898閲覧

Djangoにおいて、あるテーブルで他のテーブルのデータを利用するにはどうしたら良いでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/07/13 11:27

再度質問させて頂きます。

djangoにて簡易的なアプリを作成しています。

models.pyにて以下のような記述をしております。

python

1class Price(models.Model): 2 class Meta: 3 #テーブル名の指定 4 db_table ="price" 5 verbose_name ="商品価格" 6 verbose_name_plural ="商品価格" 7 8 #カラム名の定義 9 product = models.CharField(verbose_name="商品名", max_length=10) 10 price = models.IntegerField(verbose_name="商品価格", default=100) 11 12 def __str__(self): 13 return self.product

上記のようなテーブルがある時、

python

1class Customer(models.Model): 2 class Meta: 3 #テーブル名 4 db_table ="customer" 5 verbose_name ="注文表" 6 verbose_name_plural ="注文表" 7 8 #カラム名の定義 9 product = models.CharField(verbose_name="商品名", max_length=10) 10 quantity = models.IntegerField(verbose_name="数量",default=1) 11 12 #product部分で選んだ商品名と一致する商品名の商品価格をこちらに追加(append)したい 13 14 def __str__(self): 15 return self.product 16

例えば、

python

1customer_data = Customer.objects.all()

とすると、customerのデータが取得できるのですが、これに、商品名と一致する商品価格をpriceテーブルから取り出し、customer_dataデータに追加し、結果的に商品名、数量、商品価格のデータを格納するにはどうしたら良いでしょうか?

プログラミング素人で色々試したのですが上手くいかず苦戦しています。
アドバイス頂けると助かります。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1class Customer(models.Model): 2 class Meta: 3 #テーブル名 4 db_table ="customer" 5 verbose_name ="注文表" 6 verbose_name_plural ="注文表" 7 8 #カラム名の定義 9 # 変更箇所1 10 product = models.ForeignKey(Price, verbose_name='商品名', on_delete=models.CASCADE) 11 quantity = models.IntegerField(verbose_name="数量",default=1) 12 13 #product部分で選んだ商品名と一致する商品名の商品価格をこちらに追加(append)したい 14 15 def __str__(self): 16 # 変更箇所2 17 return self.product.product 18

OneToOneFieldを使うことで2つのモデルを紐づけることができます。これでやりたいことはできると思うのですがどうでしょう?
One-to-one relationships
Django、Userモデルのカスタマイズ(OneToOne)
1対1で紐づけるOneToOneFieldではなく1対多で紐づけるForeignKeyを使ったほうがいいと思ったので変更しました。
Many-to-one relationships

変更箇所2についてはself.productがstr型でないためエラーが出るので、Priceproductを参照するようにしてstr型を返すようにしています。


Django データベース操作 についてのまとめ
[Python] Djangoチュートリアル - 汎用業務Webアプリを最速で作る
[Python] Djangoで注文アプリケーションを作る(inline-formsets 使用方法)
ここらへん読んでおくといいと思います。

投稿2019/07/13 14:00

編集2019/07/14 12:23
mistn

総合スコア1191

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

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

退会済みユーザー

退会済みユーザー

2019/07/13 14:22

mistn様 アドバイスありがとうございます。 早速試してみます。 ちなみに、class Priceの方は修正する必要はないのでしょうか?
mistn

2019/07/13 14:25

必要ないです。
退会済みユーザー

退会済みユーザー

2019/07/13 14:42

mistn様 ご丁寧にありがとうございます。 実際にpriceテーブルのpriceを呼び出すにはどうしたら良いのでしょうか?
退会済みユーザー

退会済みユーザー

2019/07/13 14:59

こちらの方法も素晴らしい手段なのですが、もし宜しければ、appendする方法も教えて頂けないでしょうか? お手数掛けて申し訳ございません。
mistn

2019/07/13 15:43 編集

Customer経由で価格を取ろうとすると Customer.objects.get(product=Price.objects.get(product='商品名')).product.price こんな感じです。ちょっと面倒ですね。 appendするの意味がちょっと分からないのでなにか具体例を出して説明してもらえませんか?
mistn

2019/07/13 15:18

改めて質問を見て思ったのですが最終的に 商品名、数量、商品価格 のモデルを作りたいのだとしたら最初からそのようなモデルをmodels.pyに定義しておけばいいのではないでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/13 22:18

mistn様 丁寧なアドバイスありがとうございます。 最初から上記モデルを定義しないのは、customerテーブルは最初からデータが入っているわけではなく、ユーザーによる入力によってデータが投入されるといった理由でございます。 ユーザーが入力した商品名を元に、priceテーブルから一致する商品の価格を引っ張って来て、さらにはユーザーが入力した数量に掛けて合計を求めるような設計にする予定でございます。
mistn

2019/07/14 00:44

Customerに個数に応じた合計金額を登録しておきたいということですか?
退会済みユーザー

退会済みユーザー

2019/07/14 11:25

mistn様 返信遅れてすいません! 合計金額の計算はデータベースに保存するのではなく、計算結果をtemplateに表示する予定でございます!
mistn

2019/07/14 12:23

product = Price.objects.get(product='商品名') customer = Customer.objects.filter(product=product)[0] product_price = customer.product.price product_quantity = customer.quantity total_price = product_price * product_quantity こんな感じです。
退会済みユーザー

退会済みユーザー

2019/07/14 13:51

mistn様 ご丁寧にありがとうございます。 本日は出先なので、明日確認して結果をご報告します!
退会済みユーザー

退会済みユーザー

2019/07/15 06:22

mistn様 色々とご丁寧に教えて頂きありがとうございました。 とても勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問