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

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

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

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

Python

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

Q&A

解決済

4回答

639閲覧

関数の定義の仕方を教えてください。

art35

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2021/08/30 05:15

編集2021/08/31 02:10

modelの中に関数定義を行いましたがins_resultに空欄が入ってしまいます。
以前登録した内容には数字の1が入っています。
間違っていることはわかるのですが、何をどうすればよいかわからないので
ご教授いただきたいです。

内容はnext_calibration_dateが当月になっていれば'校正対象'、
来月以降であれば'合格'、当月より前であれば'不合格'と
ins_result = models.CharField(max_length=10,)に入力されるようにしたいです。

ご教授お願いいたします。

python

1 2_models.py 3 4 5class InsLedger(models.Model): 6 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 7 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE) 8 ins_num = models.CharField(max_length=10) 9 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 10 calibration_date = models.DateField(default=now)#datetime.datetime.now()) 11 next_calibration_date = models.DateField() 12 serial_num = models.CharField(max_length=20, null=True, blank=True, default='') 13 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 14 team = models.ForeignKey(TeamModel, on_delete=models.CASCADE, related_name='teams1') 15 line = models.ForeignKey(LineModel, on_delete=models.CASCADE, related_name='lines1') 16 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 17 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 18 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 19 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 20 check_items = models.ForeignKey(Check_Items, on_delete=models.CASCADE)#日常点検項目 21 ins_result = models.CharField(max_length=10,)#点検結果 22 23 def save(self, *args, **kwargs): 24 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 25 if auto_now: 26 if self.calibration_type == CALIBRATION_CHOICES[0][0]: 27 calibration_span = 1 28 elif self.calibration_type == CALIBRATION_CHOICES[1][0]: 29 calibration_span = 2 30 elif self.calibration_type == CALIBRATION_CHOICES[2][0]: 31 calibration_span = 5 32 elif self.calibration_type == CALIBRATION_CHOICES[3][0]: 33 calibration_span = 10 34 35 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 36 37 super().save(*args, **kwargs) 38 39 40 def passorfail(self): 41 today = datetime.today() 42 if self.next_calibration_date == (today.month): 43 pass_result = ('校正対象') 44 elif self.next_calibration_date > (today.month): 45 pass_result = ('合格') 46 else: 47 pass_result = ('不合格') 48 49 self.ins_result = pass_result 50 51 def __str__(self): 52 return str(self.measuring_tool)

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

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

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

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

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

maisumakun

2021/08/30 05:20

> うまく実行されません。 具体的に、どうなるのですか?
art35

2021/08/30 05:23

空欄になります。 以前に登録した内容は【1】が入っています。
guest

回答4

0

ベストアンサー

passorfail関数内でself.next_calibration_dateがNoneTypeになっていた様ですが
save関数を1とし、passorfail関数を2とするならば
passorfail関数をsave関数とリネームした事により
1を実行しているつもりが2だけを実行していた為に
self.next_calibration_dateが定義されていなかった事が原因の一つでしょう。

投稿2021/08/31 10:52

編集2021/09/01 08:37
nto

総合スコア1438

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

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

art35

2021/09/01 01:16 編集

ご指摘の内容で修正しました。修正後は別のerrorが出ましたが一旦改善できました。 まだ1部今回の問題点とは違うコードの気持ち悪さが残っていますが、機能的には問題なく動作します。 super().save(*args, **kwargs)がないと更新時に更新ができていなかったので追加しました。 添付頂いた引数については一度目を通しましたが理解できるまでみてみます。 ありがとうございました。 ベストアンサーにさせていただきます。 --- def save(self, *args, **kwargs): auto_now = kwargs.pop('next_calibration_date_auto_now', True) if auto_now: if self.calibration_type == CALIBRATION_CHOICES[0][0]: calibration_span = 1 elif self.calibration_type == CALIBRATION_CHOICES[1][0]: calibration_span = 2 elif self.calibration_type == CALIBRATION_CHOICES[2][0]: calibration_span = 5 elif self.calibration_type == CALIBRATION_CHOICES[3][0]: calibration_span = 10 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) self.passorfail() super().save(*args, **kwargs) def passorfail(self): today = datetime.today() if self.next_calibration_date.strftime('%Y-%m-%d') == today.strftime('%Y-%m-%d'): pass_result = ('校正対象') elif self.next_calibration_date.strftime('%Y-%m-%d') > today.strftime('%Y-%m-%d'): pass_result = ('合格') else: pass_result = ('不合格') self.ins_result = pass_result ---
art35

2021/09/01 01:31

tabの部分がうまく表示されていません。
nto

2021/09/01 08:39 編集

こういった場合は「tab」ではなくプログラミングでは「インデント」といいます。
art35

2021/09/01 04:37

インデントですね。ありがとうございます。 super()~ですが、ご教授いただいたように抜いてみたのですが、 登録してあるもの対して更新してもcalibration_dateの日付が変わらなかったため 機能的に問題があったので追加しました。 抜いた場合、何を変更すればよろしいでしょうか。
bsdfan

2021/09/01 05:50

> save関数の中で最後に実行しているsuper().save(*args, **kwargs)とありますが > *args, **kwargsというのは可変長引数といって、関数を実行するときに与えるものではありません。 > 実行する関数で、引数を受け取る時に使用するものです。 については正しくないです。関数を呼び出すときにも使う表現です。 super().save(*args, **kwargs) は、メソッドで受け取った引数をそのままに親クラスの同名メソッドを呼び出すときの普通のやりかたです。 なので、ここは問題とは関係ないと思います。
nto

2021/09/01 09:03 編集

bsdfanさん、オーバーライドですよね 抜けておりました。 djangoに関しても知見が浅はかでした。 部分的に回答とコメントの内容を修正致しました。 そうするとsuperの呼び出しに際してを明示的に行う事で解決に至れないでしょうか。
guest

0

  • passorfail(self)中のif文の結果がただ文字列が書かれているだけですが、個別にreturnするかself.ins_resultとやらに代入すべきなのではないでしょうか。
  • self.next_calibration_date < (today.month)これの不等号は逆では?

投稿2021/08/30 05:37

jeanbiego

総合スコア3966

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

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

art35

2021/08/30 05:54

ご指摘ありがとうございます。 以下のように修正しましたが、これでも反映されませんでした。 def passorfail(self): today = datetime.today() if self.next_calibration_date == (today.month): return self.ins_result('校正対象') elif self.next_calibration_date > (today.month): return self.ins_result('合格') else: return self.ins_result('不合格')
jeanbiego

2021/08/30 06:27

ins_result = models.CharField(max_length=10,)で定義しているins_resultをなぜcallしているのでしょうか。modelsというのはDjangoの機能なのでしょうが、class内関数の話の前にDjangoの使い方を先にさらったほうが良いのではないでしょうか。 私はDjangoは詳しくないので、すみませんがこれ以上のアドバイスはできかねます。
art35

2021/08/30 06:29

ありがとうございます。 調べてみます。
guest

0

解決しましたので添付しておきます。
コメント、回答頂きました皆様ありがとうございました。

python

1 2 def passorfail(self): 3 today = datetime.today() 4 if self.next_calibration_date.strftime('%Y-%m-%d') == today.strftime('%Y-%m-%d'): 5 pass_result = ('校正対象') 6 elif self.next_calibration_date.strftime('%Y-%m-%d') > today.strftime('%Y-%m-%d'): 7 pass_result = ('合格') 8 else: 9 pass_result = ('不合格') 10 11 self.ins_result = pass_result 12 13

投稿2021/08/31 04:51

編集2021/09/01 07:53
art35

総合スコア13

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

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

nto

2021/08/31 08:28

そもそも同じ名前の関数を定義はできません。 (定義した場合、実行する際には一番最後に定義したものが実行され、それよりも前に定義された同名の関数は無視されます。) 「def passorfailとしていたのをdef saveとして以下を参考にしたところ、動きました。」 との事ですが、定義した関数の名前を変えるのではなく、実行する関数をpassorfail()とすべきでしょう。 先程行っていた別の質問に関してもまずはこちらを訂正する必要がありそうです。
art35

2021/08/31 09:41

はい、その通りでした。 動かしてみたところ前のdef saveが実行されていませんでした。 よくわからなくなってきたので考えてみます。
guest

0

Python

1class InsLedger(models.Model): 2 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 3 ... 4 ins_result = models.CharField(max_length=10,)#点検結果

これは、次の間違いではありませんか?

Python

1class InsLedger(models.Model): 2 def __init__(self): 3 self.measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 4 ... 5 self.ins_result = models.CharField(max_length=10,)#点検結果

追記
Python は 1つのクラスに、同名のクラス属性とインスタンス属性を持てます。

Python

1class A: # A はクラス 2 result = 3 # result は A のクラス属性 3 def __init__(self): 4 self.result = 5 # result は A のインスタンス属性 5 6a = A() # a は A のインスタンス 7print('a.result =', a.result) # a.result = 5 8print('A.result =', A.result) # A.result = 3

インスタンス属性が無ければ、a.result でクラス属性を参照できます。
インスタンス属性があれば、a.result = 7 でそれを変更できますが、
インスタンス属性が無ければ、a.result = 7 で新たにインスタンス属性を
作ってしまいます。

Java で、同じようなコードを書くと、

Java

1class A { 2 int result; // result はインスタンスフィールド 3 static int result2 = 3; // result2 はクラスフィールド 4 // 同名のフィールドは持てない 5 A() { result = 5; } 6} 7 8class Main { 9 public static void main(String[] args) { 10 A a = new A(); 11 System.out.println("a.result = " + a.result); 12 System.out.println("A.result2 = " + A.result2); 13 } 14}

投稿2021/08/31 00:52

編集2021/08/31 02:20
kazuma-s

総合スコア8224

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

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

art35

2021/08/31 01:23 編集

以下の2つ以外は正常に動き、追加したこの2つに悪さがあると認識していますが違いますでしょうか。 ins_result = models.CharField(max_length=10,)#点検結果 def passorfail(self): today = datetime.today() if self.next_calibration_date == (today.month): pass_result = ('校正対象') elif self.next_calibration_date > (today.month): pass_result = ('合格') else: pass_result = ('不合格') self.ins_result = pass_result def __init__(self): self.~ を付けるとほかの項目を変更する必要が出てくるため、defpassorfailの関数部分のおかしな点があればご教授いただけると幸いです。
art35

2021/08/31 02:47

追記ありがとうございます。 初学者のため、内容が理解できません。 この内容が今回の質問に対してどう作用するのかわからないです。 また、JAVAは全く知らないためわかりません。 具体的に何をどうすればよいかご教授いただけないでしょうか。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問