web-dev-qa-db-fra.com

TypeError: type (s) d'opérande non pris en charge pour -: 'datetime.time' et 'datetime.time'

mes 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

mon 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},)

mes 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',)

En fait, j'essaie de calculer le nombre total d'heures en fonction de la différence de 'intime' et 'outtime' dans mon fichier models.py mais il s'élève au-dessus d'erroe. Je pense que je fais une erreur de syntaxe. Quelqu'un peut-il me dire quelle est la syntaxe ou la méthode correcte pour le faire? Est-ce que n'importe quel corps me suggère quoi faire pour le réparer?

12
Gaurav Tomer

C'est parce que vous ne pouvez pas soustraire un datetime.time D'un datetime.time. Convertissez-les en objets datetime.datetime Et cela renverra un objet datetime.timedelta Que vous pourriez utiliser.

Si vous avez la chance d'utiliser Django 1.8, Ils ont maintenant un DurationField qui peut être utilisé.

À défaut, je recommanderais de convertir le timedelta en secondes ou en représentation à virgule flottante afin que vous puissiez réellement le stocker dans la base de données.

EDIT: Tiré vers le haut dans les commentaires pour demi-arsing une réponse.

Par exemple - si vous souhaitez stocker le nombre de secondes (entières), vous pouvez convertir à partir d'un TimeDelta en utilisant secs = td // timedelta(seconds=1).

6
OldTinfoil