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

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

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

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

Python

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

Q&A

解決済

1回答

4188閲覧

Django modelを継承してカラムの内容で分けた別のmodelを作成する方法

art35

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2021/08/30 07:04

編集2021/09/02 23:48

appを2つ作り、Aのmodelで登録した内容を継承したmodelを3つ作りたいと考えています。
1つ目のappは製品を登録する台帳機能を持ったAのmodel。 ※作成済み
2つ目のappはAの台帳で登録した内容を引用(継承)した点検チェックシートを作成するためのBとCのmodel。

詳細と困り事は以下。

詳細:
A、台帳登録用:品に対しての情報が登録されて、多数の品が無限に登録されていく。

B、line毎に振り分ける:台帳登録用のmodel class.InsLedgerで登録したカラムの内容を継承してline登録が同じもの同士に分ける。

困り事1⇒line毎にclassを作成する?継承元が際限なく無数に増えていく場合の分け方がわかりません。

C、Bで分けたline毎の情報を読み取り専用(更新不可)で項目にして点検チェックシート用のmodelを作成する。
困り事2⇒ここも複数のclassを作成する必要がありますか?

具体的なソースコード、何を使っていくか、
また、参考になるURL等いただけても大変助かります。

よろしくお願いいたします。

イメージ説明

Aの台帳model↓

python

1 2class InsLedger(models.Model): 3 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 4 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE) 5 ins_num = models.CharField(max_length=10) 6 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES) 7 calibration_date = models.DateField(default=now)#datetime.datetime.now()) 8 next_calibration_date = models.DateField() 9 serial_num = models.CharField(max_length=20, null=True, blank=True, default='') 10 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE) 11 # team = models.ForeignKey(TeamModel, on_delete=models.CASCADE, related_name='teams1') 12 line = models.ForeignKey(LineModel, on_delete=models.CASCADE, related_name='lines1') 13 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE) 14 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE) 15 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE) 16 spec3 = models.IntegerField(choices=SPEC3_CHOICES) 17 check_items = models.ForeignKey(Check_Items, on_delete=models.CASCADE) 18 ins_result = models.CharField(max_length=10,) 19 20 def save(self, *args, **kwargs): 21 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 22 if auto_now: 23 if self.calibration_type == CALIBRATION_CHOICES[0][0]: 24 calibration_span = 1 25 elif self.calibration_type == CALIBRATION_CHOICES[1][0]: 26 calibration_span = 2 27 elif self.calibration_type == CALIBRATION_CHOICES[2][0]: 28 calibration_span = 5 29 elif self.calibration_type == CALIBRATION_CHOICES[3][0]: 30 calibration_span = 10 31 32 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 33 self.passorfail() 34 super().save(*args, **kwargs) 35 36 37 def passorfail(self): 38 today = datetime.today() 39 if self.next_calibration_date.strftime('%Y-%m-%d') == today.strftime('%Y-%m-%d'): 40 pass_result = ('対象') 41 elif self.next_calibration_date.strftime('%Y-%m-%d') > today.strftime('%Y-%m-%d'): 42 pass_result = ('合格') 43 else: 44 pass_result = ('不合格') 45 46 self.ins_result = pass_result 47 48 49 def __str__(self): 50 return str(self.measuring_tool) 51 52 class Meta: 53 verbose_name = "台帳"

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

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

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

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

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

guest

回答1

0

ベストアンサー

詳細にお答えするというよりかは、やり方の提案をいたします。

Djangoはオブジェクト指向のPythonのフレームワークで、Djangoのモデル定義もクラスです。よって、継承できます。

python

1class Base(models.Model) 2 hoge = ... 3 4class Extention1(Base) 5 hoge1 = ... 6 7class Extention2(Base) 8 hoge2 = ...

こうすると、3つともテーブルが定義され、DBにも反映され、フィールドはBaseを引き継ぎ、引き継ぎ先で定義した新しいカラムは引き継ぎ先のみで利用できます。
https://docs.djangoproject.com/en/3.2/topics/db/models/#abstract-base-classes

もし、メソッドのみを使い分けたいときはAbstractクラスを用います。
https://docs.djangoproject.com/en/3.2/topics/db/models/#abstract-base-classes

投稿2021/09/04 02:17

prof

総合スコア179

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

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

art35

2021/09/06 04:26 編集

回答ありがとうございます。 継承した時にフィールドで登録した内容が表示されるわけではなく、 class Extention1(Base)、class Extention2(Base)でも同じ内容を登録できるようになりますが、 登録した内容がこちらにも表示されるようにならないでしょうか。
art35

2021/09/06 04:54

現状ではAのmodelで登録した内容がBのmodelに反映していないのか、 管理画面で表示されません。
prof

2021/09/06 05:12

おそらく勘違いされていると思うのですが、継承したのはDBにおけるデータではなく、テーブル定義です。 よって、挿入されたデータは、テーブルに依存します。 もし、Aで登録した内容をBでも登録したければ、Aモデルのsaveメソッドをオーバーライドして、Bにも同じ内容を保存するか、Djangoのシグナルというものを利用するしかないです。
art35

2021/09/06 06:47 編集

継承というのはDBに登録したインスタンスの詳細ではなくて、フィールドの内容ということですね。 ご教授いただきありがとうございます。シグナルについては少し調べたところvew.pyにコードを 入れていく形のようですが、合っていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問