2017-01-31 2 views
0

J'ai couru dans cette erreur lorsque python en cours d'exécution manage.py migration lors de l'utilisation DurationField et TimeField les deux me donnent un:TimeField et DurationField int erreur

return int(round(value.total_seconds() * 1000000)) 
AttributeError: 'int' object has no attribute 'total_seconds' 

J'ai vu cette erreur sur ce site, mais seulement pour une Django 1.8. Actuellement, j'utilise Django 1.10. J'ai essayé ces suggesions:

DurationField(default=timedelta()), 
DurationField(), 
DurationField(default=timedelta()), 
DurationField(default=int(timedelta(minutes=20).total_seconds())). 

Mon modèle ressemble actuellement:

class SomeModel(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    lunchnumber = models.IntegerField(null=True, blank=True) 
    role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES,null=True, blank=True) 
    breaktime = models.DurationField(default=timedelta(minutes=45)) 

    def to_python(self, value): 
     if value is None: 
      return value 
     if isinstance(value, datetime.timedelta): 
      return value 
     try: 
      parsed = parse_duration(value) 
     except ValueError: 
      pass 
     else: 
      if parsed is not None: 
       return parsed 

Aborder la question de Prakhar Trivedi: Je ne sais pas quelle valeur ne fonctionne pas bien. J'étais sous l'hypothèse que c'était la valeur par défaut que django essayait de remplir avec cette table de base de données. Je suis sous cette impression à cause de ....... dans get_db_prep_value retour int (rond (value.total_seconds() * 1000000)) AttributeError: 'int' objet n'a pas d'attribut 'total_seconds'

Répondre Réponse d'iklinac:

Je suis entré et j'ai ajouté la valeur par défaut = timedelta (minutes = 45). Je l'ai importé du datetime Mais je sens qu'il me manque quelque chose. Je suis très nouveau à ce sujet et n'ai pas vu une fonction to_python. Qu'est-ce qui me manque? Je reçois toujours la même erreur?

+0

Qu'est-ce que ** value ** dans ** value.total_seconds() **. Lequel des champs est la valeur de votre modèle? –

+1

ooh @PrakharTrivedi c'est ce que je voulais dire, il semble que j'ai demandé à autre chose :) – e4c5

+0

Hey Travis avez-vous vérifié que vous avez importé Timedelta comme je l'ai déclaré ci-dessous dans votre models.py. En ce qui concerne aussi la fonction to_python qui est la fonction derrière le champ Durée, il n'est pas nécessaire de l'inclure. En ce qui concerne la dernière partie du commentaire si datetime rencontre toujours des problèmes, vous pouvez utiliser le format d'heure django indiqué ci-dessous dans la section commentaire de parse_value – iklinac

Répondre

0

S'il vous plaît vérifier si vous importez timedelta du paquet datetime :)

from datetime import timedelta 

Ces deux éléments doivent travailler

DurationField(default=timedelta(minutes=20)) 
DurationField(default=timedelta()) 

fonction to_python de DurationField suit

if value is None: 
     return value 
    if isinstance(value, datetime.timedelta): 
     return value 
    try: 
     parsed = parse_duration(value) 
    except ValueError: 
     pass 
    else: 
     if parsed is not None: 
      return parsed 

Si vous êtes ayant encore des problèmes avec timedelta vous pouvez utiliser l'un de ces formats comme indiqué dans pa rse_duration commentaires de code

def parse_duration(value): 
    """Parses a duration string and returns a datetime.timedelta. 

    The preferred format for durations in Django is '%d %H:%M:%S.%f'. 

    Also supports ISO 8601 representation. 
    """ 
    match = standard_duration_re.match(value) 
    if not match: 
     match = iso8601_duration_re.match(value) 
    if match: 
     kw = match.groupdict() 
     if kw.get('microseconds'): 
      kw['microseconds'] = kw['microseconds'].ljust(6, '0') 
     kw = {k: float(v) for k, v in six.iteritems(kw) if v is not None} 
     return datetime.timedelta(**kw)