2015-07-01 10 views
5

meine models.py:Typeerror: nicht unterstützte Operandtyp (e) für: - 'datetime.time' und 'datetime.time'

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 

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

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

Eigentlich basiert auf einer Differenz von 'intime' und 'outtime' in meinem Modell ich versuche Gesamtzahl der Stunden zu berechnen an der py-datei, aber es erhebt sich über erroe. Ich denke, ich mache Syntaxfehler. Kann mir jemand bitte sagen, was ist die richtige Syntax oder Methode dafür? Jeder Körper bitte schlagen Sie mir vor, was zu tun ist, um es zu beheben?

+1

Ich bin mir nicht sicher, warum Sie dies in einem Feld speichern möchten, wenn es aus den In- und Out-Zeiten trivial berechnet wird. Lieber eine Methode, die sie bei Bedarf zurückgibt. –

+0

Wie kann ich es in meinen Vorlagen zeigen? Angenommen, ich habe eine solche Funktion erstellt, wie kann ich sie dann in meinen Vorlagen den Benutzern zeigen? –

+1

In genau der gleichen Weise. Wenn es sich um eine Methode im Modell handelt und keine Argumente verwendet werden, können Sie sie direkt aus der Vorlage aufrufen. –

Antwort

3

Es ist, weil Sie eine datetime.time von einer datetime.time nicht subtrahieren können. Konvertiere sie in datetime.datetime Objekte und es wird ein datetime.timedelta Objekt zurückgegeben, das du verwenden kannst.

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

dass Andernfalls würde ich empfehlen, die timedelta in entweder Sekunden oder Fließkommadarstellung umgewandelt wird, so dass Sie tatsächlich in die Datenbank speichern kann.

EDIT: Pulled in Kommentaren für halbe Antwort eine Antwort.

Zum Beispiel - wenn Sie die Anzahl der (ganzen) Sekunden speichern möchten, können Sie von TimeDelta mit secs = td // timedelta(seconds=1) konvertieren.

+2

Verwenden Sie 'td/timedelta (Tage = 1)' anstelle von 'float (td.days) + float (td.seconds)/float (86400)'. Verwenden Sie 'td.total_seconds()' anstelle von 'timedelta.days * 86400 + timedelta.seconds' (wenn Sie Mikrosekunden löschen möchten, um auf ganzzahlige Sekunden zu kürzen, können Sie' td // timedelta (seconds = 1) ') verwenden. Verwende 'timedelta (seconds = some_seconds)' 'anstelle von' timedelta (someSeconds/86400) '. Bitte, [lesen Sie die entsprechenden Dokumente] (https://docs.python.org/3/library/datetime.html#timedelta-objects), wenn Sie Fragen zu einem bestimmten Thema beantworten möchten. – jfs

+0

"Konvertieren sie in datetime.datetime", aber wie? – jonalv

+0

Es hängt davon ab, aber ohne zu wissen, was Sie gerade versuchen, tendiere ich dazu, 'datetime.combine' zu ​​verwenden. – OldTinfoil

Verwandte Themen