前提・実現したいこと
台帳機能として作成した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)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/23 02:47
2021/08/23 04:44
2021/08/23 06:55
2021/08/23 07:03
2021/08/23 07:35 編集
2021/08/23 08:13