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

Posted

技术标签:

【中文标题】TypeError: 不支持的操作数类型 -: \'datetime.time\' 和 \'datetime.time\'【英文标题】:TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'TypeError: 不支持的操作数类型 -: 'datetime.time' 和 'datetime.time' 【发布时间】:2015-09-18 07:09:26 【问题描述】:

我的模型.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

我的意见.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,)

我的表单.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' 的差异来计算总小时数,但它会超出错误。我想我在做语法错误。谁能告诉我这样做的正确语法或方法是什么? 任何机构请建议我如何解决它?

【问题讨论】:

我不确定你为什么要将它存储在一个字段中,因为它是从进出时间计算出来的。最好有一个按需返回它的方法。 那么如何在我的模板中显示它?假设我已经制作了这样一个功能,那么如何在我的模板中向用户显示它? 以完全相同的方式。如果它是模型上的方法并且不带参数,则可以直接从模板中调用它。 【参考方案1】:

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

If you're lucky enough to be using Django 1.8, they now have a DurationField that can be used.

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

编辑:在 cmets 中提取了一半的答案。

例如 - 如果您想存储(整数)秒数,您可以使用 secs = td // timedelta(seconds=1)TimeDelta 转换。

【讨论】:

使用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)。如果您要回答有关某个主题的问题,请read the corresponding docs。 “将它们转换为 datetime.datetime”,但是如何? 视情况而定,但在不知道您具体尝试什么的情况下,我倾向于使用datetime.combine

以上是关于TypeError: 不支持的操作数类型 -: 'datetime.time' 和 'datetime.time'的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:不支持的操作数类型/:'str'和'str'

TypeError: *: 'int' 和 'NoneType' 不支持的操作数类型

TypeError:&:'str'和'str'不支持的操作数类型

TypeError: 不支持的操作数类型 -: 'int' 和 'list'

TypeError:不支持的操作数类型/:'float'和'datetime.timedelta'

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