2016-12-03 1 views
0

Je prends rendez-vous pour une fonctionnalité de réservation dans une application. Pour cela, j'ai le début et la fin de deux quarts de travail. En utilisant les valeurs de ces deux champs, j'aimerais trouver le nombre total de minutes dans chaque quart, puis le diviser en tranches d'une demi-heure. Le problème que j'ai est le suivant:Prise de valeur de Timefield dans un modèle et Utilisation des opérations datetime sur celui-ci.

La bibliothèque datetime attend des objets datetime d'évaluer un timedelta mais tout ce que j'ai sont TimeField. Comment puis-je convertir TimeField à datetime.time valeur

Ci-dessous le modèle:

class ClinicMembershipAttribute(models.Model): 
    DAY_CHOICES = (
     ('Monday', 'Monday'), 
     ('Tuesday', 'Tuesday'), 
     ('Wednesday', 'Wednesday'), 
     ('Thursday', 'Thursday'), 
     ('Friday', 'Friday'), 
     ('Saturday', 'Saturday'), 
     ('Sunday', 'Sunday') 
    ) 
    clinicmembership = models.ForeignKey(ClinicMembership, null=True, blank=True) 
    day = models.CharField(choices=DAY_CHOICES, null=True, blank=True, max_length=12) 
    shift_one_start = models.TimeField(null=True, blank=True) 
    shift_one_end = models.TimeField(null=True, blank=True) 
    shift_two_start = models.TimeField(null=True, blank=True) 
    shift_two_end = models.TimeField(null=True, blank=True) 

    def get_appointment_status_string(self): 
     first_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end)).time() 
     second_shift_delta = (datetime.datetime.combine(datetime.date(1,1,1),self.shift_two_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_two_end)).time() 
     first_shift_seconds = first_shift_delta.seconds() 
     second_shift_seconds = second_shift_delta.seconds() 


    def __str__(self): 
     return self.day + " - '"+str(self.shift_one_start) +" - " + str(self.shift_one_end) + "', '" + str(self.shift_two_start) +" - " + str(self.shift_two_end) + "'" 

erreur est first_shift_delta et second_shift_delta.

Répondre

0

Autant que je sache, vous n'avez pas besoin de s'inquiéter de la conversion DateField à l'objet datetime.time. Django le fera pour vous quand vous obtiendrez des données de DB. TimeField a to_python() méthode à cette fin. Vous pouvez vérifier que TimeField renvoie datetime.time en regardant source. Je ne vois qu'un seul problème dans votre code. Si la valeur de TimeField() est nul, vous recevrez un message d'erreur:

combine() argument must be datetime.time, not None. 

probaly vous pouvez ajouter auto_now_add=True attribut à vos champs et définissez null=False, blank=False pour éviter une telle situation. Essayez de vous exécuter le code datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) doit fonctionner même si IDE dit qu'il contient une erreur.

0

Vous pouvez utiliser DateTimeField des docs

Une liste des formats utilisés pour tenter de convertir une chaîne en un objet datetime.datetime valide.

Si aucun argument input_formats est fourni, les formats d'entrée par défaut sont:

['%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' 
'%Y-%m-%d %H:%M',  # '2006-10-25 14:30' 
'%Y-%m-%d',    # '2006-10-25' 
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59' 
'%m/%d/%Y %H:%M',  # '10/25/2006 14:30' 
'%m/%d/%Y',    # '10/25/2006' 
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59' 
'%m/%d/%y %H:%M',  # '10/25/06 14:30' 
'%m/%d/%y']    # '10/25/06' 

Essayez de changer

shift_one_start = models.TimeField(null=True, blank=True) 

à

shift_one_start = models.DateTimeField(null=True, blank=True) 
+0

Hey Westly! quand j'essaie de first_shift_delta à l'intérieur de la fonction datetime.combine, il est dit que le type attendu 'time' a obtenu 'TimeField' à la place. – blueChair

+0

Essayez de changer shift_one_start = models.TimeField (null = True, vide = True) –

0
datetime.datetime.combine(datetime.date(1,1,1),self.shift_one_start) - datetime.datetime.combine(datetime.date(1,1,1), self.shift_one_end) 

retour un objet datetime.timedelta, vous peut utiliser total_seconds() pour obtenir des secondes, puis vous pouvez le convertir en minutes