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

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

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

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

Python

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

Q&A

解決済

1回答

1036閲覧

Django_python modelで登録した内容から特定条件を抜き取りまとめる

art35

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2021/08/19 06:12

編集2021/08/23 07:18

前提・実現したいこと

台帳機能として作成したapp中の複数のmodelの中から登録している、ある特定の条件に一致しているものだけを抽出してそれらをまとめたい。

具体的には添付ソースの各モデルで作成、登録した情報からteam,line,processを一つの集団として
3つが合致した情報を全てのモデルから抜き取ってまとめたい。

登録されていく情報、組み合わせは無制限に増えていくことになり、
どの様に指定することができるのでしょうか。

※実際のmodelにはclass InsLedger1~12までありますが、文字制限のため入力できませんでした。MEASURING_INS_GROUP_CHOICESと同じ数のmodelがあります。

発生している問題・エラーメッセージ

教材を購入したりグーグル検索をかけたが、具体的な方法までたどり着けない。 all_insledgers = InsLedger1.objects.all() all_insledgers = InsLedger2.objects.all() all_insledgers = InsLedger3.objects.all() . . . で取り出せそうですが、条件が登録した内容になってくるため条件の付け方が不明です。

該当のソースコード

python_models.py

1 2import datetime 3from dateutil.relativedelta import relativedelta 4from django.db import models 5from dateutil.relativedelta import relativedelta 6from team.models import TeamModel 7from line.models import LineModel 8from mdevice.models import Device 9from process.models import Process 10from item.models import Item 11from product_num.models import Product_num 12from useapp.models import Useapp 13from spec_etc.models import Spec1, Spec2 14from django.utils.timezone import now 15 16# Create your models here. 17 18MEASURING_INS_GROUP_CHOICES = ( 19 (1,'マイクロメータ'), 20 (2,'ノギス'), 21 (3,'内径'), 22 (4,'スナップメータ'), 23 (5,'ハイトゲージ'), 24 (6,'ダイヤルゲージ'), 25 (7,'ピンゲージ'), 26 (8,'リングゲージ'), 27 (9,'マスターゲージ'), 28 (10,'大型'), 29 (11,'その他'), 30 (12,'外部'), 31) 32 33CALIBRATION_CHOICES = ( 34 (1,'1年校正'), 35 (2,'2年校正'), 36 (5,'5年校正'), 37 (10,'10年校正'), 38) 39 40SPEC3_CHOICES = ( 41 (1, 'A'), 42 (2, 'D'), 43) 44 45class InsLedger1(models.Model): 46 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 47 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE)#測定具名称 48 ins_num = models.CharField(max_length=10)#登録NO. 49 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 50 calibration_date = models.DateTimeField(default=now)#datetime.datetime.now())#校正日 51 next_calibration_date = models.DateTimeField()#次回校正日 52 serial_num = models.CharField(max_length=20, null=True, blank=True, default='')#シリアルナンバー 53 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 54 team = models.ForeignKey(TeamModel, on_delete=models.CASCADE)#チーム 55 line = models.ForeignKey(LineModel, on_delete=models.CASCADE)#ライン名称 56 process = models.ForeignKey(Process, on_delete=models.CASCADE)#工程 57 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 58 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 59 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 60 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 61 item = models.ForeignKey(Item, on_delete=models.CASCADE)#日常点検項目 62 63 def save(self, *args, **kwargs): 64 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 65 if auto_now: 66 if self.calibration_type == CALIBRATION_CHOICES[0]: 67 calibration_span = 1 68 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 69 super().save(*args, **kwargs) 70 71 def __str__(self): 72 return str(self.measuring_tool) 73 74 class Meta: 75 verbose_name = "マイクロメータ" 76 77 78class InsLedger2(models.Model): 79 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=2) 80 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE)#測定具名称 81 ins_num = models.CharField(max_length=10)#登録NO. 82 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 83 calibration_date = models.DateTimeField(default=now)#datetime.datetime.now())#校正日 84 next_calibration_date = models.DateTimeField()#次回校正日 85 serial_num = models.CharField(max_length=20, null=True, blank=True, default='')#シリアルナンバー 86 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 87 team = models.ForeignKey(TeamModel, on_delete=models.CASCADE)#チーム 88 line = models.ForeignKey(LineModel, on_delete=models.CASCADE)#ライン名称 89 process = models.ForeignKey(Process, on_delete=models.CASCADE)#工程 90 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 91 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 92 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 93 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 94 item = models.ForeignKey(Item, on_delete=models.CASCADE)#日常点検項目 95 96 def save(self, *args, **kwargs): 97 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 98 if auto_now: 99 if self.calibration_type == CALIBRATION_CHOICES[0]: 100 calibration_span = 1 101 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 102 super().save(*args, **kwargs) 103 104 def __str__(self): 105 return str(self.measuring_tool) 106 107 class Meta: 108 verbose_name = "ノギス" 109 110. 111. 112. 113

補足情報(FW/ツールのバージョンなど)

変更後の内容
※processは削除しました。

models.py

1 2import datetime 3from typing import ClassVar 4from dateutil.relativedelta import relativedelta 5from django.db import models 6from team.models import TeamModel, LineModel, Team_Line 7from mdevice.models import Device, Check_Items, Spec1, Spec2, Useapp 8from product_num.models import Product_num 9from django.utils.timezone import now 10from itertools import chain 11import django_filters 12 13 14# Create your models here. 15 16MEASURING_INS_GROUP_CHOICES = ( 17 (1,'マイクロメータ'), 18 (2,'ノギス'), 19 (3,'内径'), 20 (4,'スナップメータ'), 21 (5,'ハイトゲージ'), 22 (6,'ダイヤルゲージ'), 23 (7,'ピンゲージ'), 24 (8,'リングゲージ'), 25 (9,'マスターゲージ'), 26 (10,'大型'), 27 (11,'その他'), 28 (12,'外部'), 29) 30 31CALIBRATION_CHOICES = ( 32 (1,'1年校正'), 33 (2,'2年校正'), 34 (5,'5年校正'), 35 (10,'10年校正'), 36) 37 38SPEC3_CHOICES = ( 39 (1, 'A'), 40 (2, 'D'), 41) 42 43 44class InsLedger(models.Model): 45 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 46 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE) 47 ins_num = models.CharField(max_length=10) 48 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 49 calibration_date = models.DateTimeField(default=now)#datetime.datetime.now()) 50 next_calibration_date = models.DateTimeField() 51 serial_num = models.CharField(max_length=20, null=True, blank=True, default='') 52 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 53 team = models.ForeignKey(Team_Line, on_delete=models.CASCADE) 54 line = models.ForeignKey(Team_Line, on_delete=models.CASCADE) 55 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 56 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 57 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 58 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 59 check_items = models.ForeignKey(Check_Items, on_delete=models.CASCADE)#日常点検項目 60 61 def save(self, *args, **kwargs): 62 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 63 if auto_now: 64 if self.calibration_type == CALIBRATION_CHOICES[0]: 65 calibration_span = 1 66 elif self.calibration_type == CALIBRATION_CHOICES[1]: 67 calibration_span = 2 68 elif self.calibration_type == CALIBRATION_CHOICES[2]: 69 calibration_span = 5 70 elif self.calibration_type == CALIBRATION_CHOICES[3]: 71 calibration_span = 10 72 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 73 super().save(*args, **kwargs) 74 75 def __str__(self): 76 return str(self.measuring_tool) 77 78# まとめる 79all_insledgers = [] 80all_insledgers.append(InsLedger.objects.all()) 81 82# filterする 83all_insledgers_filtered = [] 84for item in all_insledgers: 85 item_filtered = item.filter(team="チーム", line="ライン") 86 all_insledgers_filtered.append(item_filtered) 87 88# 結合する 89result = list(chain(*all_insledgers_filtered)) 90 91for i in result: 92 print(i) 93# 3つが合致したモデルが表示される 94

admin.py

1 2from django.contrib import admin 3from .models import InsLedger 4 5class InsLedgerAdmin(admin.ModelAdmin): 6 list_display = ('measuring_tool','ins_num','team','line','calibration_date', 'next_calibration_date') 7 list_filter = ["measuring_ins_group"] 8admin.site.register(InsLedger, InsLedgerAdmin)

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

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

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

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

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

guest

回答1

0

ベストアンサー

簡単にやるなら

Python

1from itertools import chain 2 3# まとめる 4all_insledgers = [] 5all_insledgers.append(InsLedger1.objects.all()) 6all_insledgers.append(InsLedger2.objects.all()) 7# ・・・(略) 8all_insledgers.append(InsLedger12.objects.all()) 9 10# filterする 11all_insledgers_filtered = [] 12for item in all_insledgers: 13 item_filtered = item.filter(team="チーム", line="ライン", process="プロセス") 14 all_insledgers_filtered.append(item_filtered) 15 16# 結合する 17result = list(chain(*all_insledgers_filtered)) 18 19for i in result: 20 print(i) 21# 3つが合致したモデルが表示される

でも、12個も同じようなモデルを作らずに、1つにまとめた方が良いと思います。
InsLedger1とInsLedger2の違いはmeasuring_ins_groupdefaultだけですか?
なら、保存するときにmeasuring_ins_groupを指定して保存すればいいと思います。


Adminでフィルター

InsLedgerというmodelにまとめたとすると、

Python

1# admin.py 2from django.contrib import admin 3from .models import InsLedger 4 5class InsLedgerAdmin(admin.ModelAdmin): 6 list_filter = ["measuring_ins_group"] 7 8admin.site.register(InsLedger, InsLedgerAdmin) 9# InsLedgerAdminを追加する

投稿2021/08/21 06:26

編集2023/07/25 23:09
ForestSeo

総合スコア2720

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

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

art35

2021/08/23 02:47

回答ありがとうございます。 初学者のため、いろいろ手探りでコードを書いているため不格好になっていると思います。 各modelの違いはおっしゃられましたmeasuring_ins_groupのdefaultと class Meta: verbose_name = "###"  この部分のみです。 admin管理画面に各modelのname表示と測定具事の登録しかわからなかったためこのような形でコードを書きましたが、上記の登録は一か所で保存は別に分ける方法があればご教授いただけますでしょうか。
ForestSeo

2021/08/23 04:44

> 保存は別に分ける その必要はありますか? 一つのmodelに保存しといて、例えば任意のmeasuring_ins_groupのデータが見たければ、measuring_ins_groupでフィルターをかけて表示すればいいと思います。 admin管理画面でフィルターをかけるには、admin.pyを編集する必要があります。それについては解答に追記しておきます。 > 上記の登録は一か所で保存は別に分ける方法 できると思いますが、admin管理画面のみでは難しいと思います。
art35

2021/08/23 06:55

フィルターをかける方法で表示することにいたしました。 変更した内容でmakemigrationsしたところ ーーーーーーーーーーーーーーーーーーーーーーー Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line utility.execute() File "/home/tom/type1/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute django.setup() File "/home/tom/type1/venv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate app_config.import_models() File "/home/tom/type1/venv/lib/python3.8/site-packages/django/apps/config.py", line 301, in import_models self.models_module = import_module(models_module_name) File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/tom/type1/type1cs/ins_ledger1/models.py", line 97, in <module> item_filtered = item.filter(team="チーム", line="ライン") File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/query.py", line 941, in filter return self._filter_or_exclude(False, args, kwargs) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude clone._filter_or_exclude_inplace(negate, args, kwargs) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace self._query.add_q(Q(*args, **kwargs)) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1393, in add_q clause, _ = self._add_q(q_object, self.used_aliases) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1412, in _add_q child_clause, needed_inner = self.build_filter( File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1286, in build_filter lookups, parts, reffed_expression = self.solve_lookup_type(arg) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1112, in solve_lookup_type _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1516, in names_to_path if field.is_relation and not field.related_model: File "/home/tom/type1/venv/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "/home/tom/type1/venv/lib/python3.8/site-packages/django/db/models/fields/related.py", line 95, in related_model apps.check_models_ready() File "/home/tom/type1/venv/lib/python3.8/site-packages/django/apps/registry.py", line 141, in check_models_ready raise AppRegistryNotReady("Models aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ググってみた情報で試してみましたが解決できませんでした。 わかりますでしょうか?
art35

2021/08/23 07:03

一つ分かっていることは以下コードの item_filtered = item.filter(team="チーム", line="ライン") item.filterのfilterが反応しておりません。 そこに対してできることを検索中です。
ForestSeo

2021/08/23 07:35 編集

InsLedgerだけにまとめたら、最初に解答した部分はもういりません。 # まとめる から # 3つが合致したモデルが表示される まで削除してください。 ---------------- team, line, processで絞り込むなら、 InsLedgerAdminのlist_filterを["team", "line", "process"] としてください
art35

2021/08/23 08:13

ありがとうございます!!! やっと出来ました! makemigrationsしたところ何故かdjango.db.utils.OperationalError: no such table:ins_ledger1_insledgerになっていたので 少し時間がかかりましたが、db.sqlite3ファイルを消してpython3 manage.py makemigrations ins_ledger1 でmakemigrations を行ってmigrateしたところ管理画面に表示されるようになりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問