TypeError:不支持的操作数类型 - :'datetime.time'和'datetime.time'

Gau*_*mer 12 python django-templates django-models django-views

我的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
Run Code Online (Sandbox Code Playgroud)

我的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},)
Run Code Online (Sandbox Code Playgroud)

我的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',)
Run Code Online (Sandbox Code Playgroud)

实际上我正在尝试根据我的models.py文件中的'intime''outtime'我的差异来计算总小时数,但它会高于错误.我想我在做语法错误.任何人都可以告诉我这样做的正确语法或方法是什么?任何身体请建议我该怎么做才能解决它?

Old*_*oil 7

这是因为你不能datetime.time从a中减去a datetime.time.将它们转换为datetime.datetime对象,它将返回一个datetime.timedelta可以使用的对象.

如果你有幸使用Django 1.8,他们现在有一个DurationField可以使用.

如果做不到这一点,我建议将其timedelta转换为秒或浮点表示,以便您可以将其实际存储到数据库中.

编辑:在评论中拉了半个答案.

例如-如果你想存储的(整数),秒数,你可以从一个转换TimeDelta使用secs = td // timedelta(seconds=1).

  • “将它们转换为 datetime.datetime”,但是如何呢? (4认同)
  • 使用`td/timedelta(days = 1)`而不是`float(td.days)+ float(td.seconds)/ float(86400)`.使用`td.total_seconds()`代替`timedelta.days*86400 + timedelta.seconds`(如果要删除微秒,则截断为整数秒;您可以使用`td // timedelta(seconds = 1)`).使用`timedelta(seconds = some_seconds)`而不是`timedelta(someSeconds/86400)`.如果您要回答有关某些主题的问题,请[阅读相应的文档](https://docs.python.org/3/library/datetime.html#timedelta-objects). (2认同)