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

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

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

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

Python

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

Q&A

解決済

1回答

2674閲覧

Django 'NoneType' object has no attribute 'strftime'

art35

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2021/08/31 07:59

以下のコードを実行するとエラーが発生して進めません。
エラーから
if self.next_calibration_date.strftime('%Y-%m') == today.strftime('%Y-%m'):
ここでAttributeErrorが発生していますが、調べても対処法がわかりません。

この部分をターミナルで確認すると
print(type(self.next_calibration_date))
<class 'NoneType'>となっているのでこの辺りを訂正するべきかと思っています。

また、以下のstrftimeはvscode上で反応していないようです。
if self.next_calibration_date.strftime('%Y-%m')

わかる方いらっしゃいましたらご教授ください。

python

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

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

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

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

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

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

guest

回答1

0

自己解決

解決したので添付します。
他の質問で指摘されましたが、基本的な部分でdef saveが2つあり同じ名前の関数は使えないようです。
1を実行しているつもりが2だけを実行していた為に
self.next_calibration_dateが定義されていなかった事が原因のようです。
あとは別のerrorが出ていましたので('%Y-%m')を('%Y-%m-%d')に変更しています。


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

投稿2021/09/01 01:30

art35

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問