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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Django

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

Q&A

解決済

1回答

2121閲覧

django models.py内でのdatetime計算

usaabc

総合スコア1

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Django

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

0グッド

0クリップ

投稿2021/03/13 15:39

編集2021/03/18 13:56

djangoのmodels.py内でdatetime型の引き算をしたいです。

modelの中に開始時間と終了時間があり、終了ー開始=作業時間というデータを
model内で計算したいのですが方法がわかりません。

saveメソッドを使用する方法を試してみたのですが、テンプレート側で呼び出すと<django.db.models.fields.DateTimeField>と表示され計算結果が出ませんでした。

テンプレート側で引き算する分には表示できるのですが、
グラフ化するにあたってmodel内に引き算した時間のレコードを作りたいです。
そもそも可能なのか含めご教示いただけないでしょうか。

該当のソースコード

models.py from django.db import models from django.utils import timezone import datetime class time_mgr(models.Model): dt = models.DateTimeField #終了時間 ー 開始時間 = 作業時間 startdt = models.DateTimeField(default=timezone.now) #開始時間 enddt = models.DateTimeField(default=timezone.now) #終了時間 def save(self, *args, **kwargs): self.dt = self.enddt - self.startdt super(time_mgr, self).save(*args, **kwargs)

エラーメッセージ

dt = models.DateTimeFieldを
dt = models.DurationField(blank=True)へ変更した後に以下のエラーになりました。

ProgrammingError at /page1/ column "dt" is of type timestamp with time zone but expression is of type interval LINE 1: ...tamptz, '2021-03-18T22:19:06+09:00'::timestamptz, '0 days 72... ^ HINT: You will need to rewrite or cast the expression.
python3.9 django3.1.6 Postgres 3.0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1dt = models.DateTimeField

Python

1dt = models.DateTimeField(blank=True)

ですかね。

追記

返ってくる値が、datetime.timedeltaだったので、
models.DurationFieldを使えばできました。

Python

1dt = models.DurationField(blank=True)

です。

投稿2021/03/16 00:41

編集2023/07/25 23:13
ForestSeo

総合スコア2720

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

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

usaabc

2021/03/17 15:00

ご回答ありがとうございます。 教えていただいた内容を試したところ、データ追加時に 『expected string or bytes-like object』エラーが発生しました。 検証のため、modelにIntegerFieldを追加して、(blank=True)もきちんと付けて、同じsaveメソッドで整数の引き算をしたところ、テンプレ側で正常に結果が表示されました。 datetime型で出るエラーについては別問題かと思うので引き続き調べてみたいと思います。
ForestSeo

2021/03/18 00:51

追記しました。 こちらの環境ではいけたので、試してみてください。
usaabc

2021/03/18 14:19

再度のアドバイスありがとうございます。 変更したところ、「column "dt" is of type timestamp with time zone but expression is of type interval」というエラーになりました。 最初の質問段階で記載できておらず申し訳なかったのですが、こちらはPostgresを使用しております。調べてみるとPostgresの場合はDurationFieldの扱いが若干異なるような記載も見かけました。 自身での調査が甘い段階で恐縮ですが、何かお分かりになればアドバイスいただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問