web-dev-qa-db-ja.com

TypeError:-: 'datetime.time'および 'datetime.time'でサポートされていないオペランドタイプ

私のmodels.py:

class Attendancename(models.Model):
    teacher_name = models.ForeignKey(Teachername, default='Ram')
    date = models.DateField('Date', default=datetime.datetime.today)
    intime = models.TimeField('IN-TIME', auto_now=True)
    outtime = models.TimeField('OUT-TIME', auto_now=True)

    def hours_conversion(self):
        startdelta = datetime.timedelta(hours=self.intime.hours, minutes=self.intime.minutes, seconds=self.intime.seconds)
        enddelta = datetime.timedelta(hours=self.outtime.hours, minutes=self.outtime.minutes, seconds=self.outtime.seconds)
        return (enddelta-startdelta).seconds/3600

    def __str__(self):
        return "%s" %self.teacher_name

私のviews.py:

def add_atten(request):
    if request.method == 'POST':
        form = AttendancenameForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('student:listatten'))
        else:
            print(form.errors)
    else:       
        form = AttendancenameForm()
    return render(request, 'add_atten.html', {'form': form},)

私のforms.py:

class AttendancenameForm(ModelForm):
    intime = forms.TimeField(input_formats=('%H:%M',))
    outtime = forms.TimeField(input_formats=('%H:%M',))
    teacher_name = forms.ModelChoiceField(queryset=Teachername.objects.all())
    class Meta:
        model = Attendancename
        fields = ('teacher_name', 'date', 'intime', 'outtime',)

実際、models.pyファイルの'intime''outtime'の差に基づいて合計時間数を計算しようとしていますが、エラーが発生します。私は構文エラーをやっていると思います。誰でもできますか?そうするための正しい構文またはメソッドは何ですか?どんな体でもそれを修正するために何をすべきかを私に提案してください?

12
Gaurav Tomer

_datetime.time_から_datetime.time_を減算できないためです。それらを_datetime.datetime_オブジェクトに変換すると、使用できる_datetime.timedelta_オブジェクトが返されます。

幸運なことに_Django 1.8_を使用している場合は、使用可能なDurationFieldが用意されています。

それができない場合は、timedeltaを秒または浮動小数点表現に変換して、実際にデータベースに格納できるようにすることをお勧めします。

EDIT:回答を半ば拒否するためにコメントで引き上げられました。

たとえば、(整数)秒数を格納する場合は、secs = td // timedelta(seconds=1)を使用してTimeDeltaから変換できます。

6
OldTinfoil