2015-07-01 12 views
5

mia models.py:TypeError: tipo di operando non supportato (s) per -: 'datetime.time' e '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 

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

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

in realtà sto cercando di calcolare il numero totale di ore in base alla differenza di 'intime' e 'outtime' nel mio modello s.py file ma si eleva sopra erroe. Penso che sto facendo un errore di sintassi. Qualcuno può dirmi qual è la sintassi corretta o il metodo per farlo? Qualunque corpo mi suggerisca cosa fare per risolverlo?

+1

Non sono sicuro del motivo per cui si desidera archiviare questo in un campo, quando viene calcolato in modo banale dai tempi di entrata e di uscita. Meglio avere un metodo che lo renda su richiesta. –

+0

Quindi, come posso mostrarlo nei miei modelli? Supponiamo che abbia fatto una tale funzione, allora come posso mostrarlo ai miei modelli all'utente? –

+1

Allo stesso modo. Se si tratta di un metodo sul modello e non accetta argomenti, puoi chiamarlo direttamente dal modello. –

risposta

3

È perché non è possibile sottrarre uno datetime.time da un datetime.time. Convertili in oggetti datetime.datetime e restituirà un oggetto datetime.timedelta che potresti utilizzare.

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

In mancanza di questo, consiglierei la conversione del timedelta in entrambi i secondi o una rappresentazione in virgola mobile in modo da poter realmente conservarlo al database.

MODIFICA: Inserito nei commenti per metà risposta.

Ad esempio: se si desidera memorizzare il numero di secondi (numero intero), è possibile convertire da un utilizzando secs = td // timedelta(seconds=1).

+2

usa 'td/timedelta (days = 1)' invece di 'float (td.days) + float (td.seconds)/float (86400)'. Usa 'td.total_seconds()' invece 'timedelta.days * 86400 + timedelta.seconds' (se vuoi rilasciare microsecondi, per troncare a interi interi, puoi usare' td // timedelta (seconds = 1) '). Usa 'timedelta (seconds = some_seconds)' invece di 'timedelta (someSeconds/86400)'. Per favore, [leggi i documenti corrispondenti] (https://docs.python.org/3/library/datetime.html#timedelta-objects) se hai intenzione di rispondere a domande su qualche argomento. – jfs

+0

"Converti in datetime.datetime", ma come? – jonalv

+0

Dipende, ma senza sapere cosa stai tentando in modo specifico, tendo a usare 'datetime.combine'. – OldTinfoil

Problemi correlati