2017-01-31 11 views
0

DurationFieldを使用した場合のpython manage.pyの移行を実行しているとき、私は、このエラーに遭遇しているとTimeFieldの両方が私に与える:TimeFieldとDurationField int型エラー

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

私はこのサイト上だけのために、このエラーを見てきましたDjango 1.8。現在、私はDjango 1.10を使用しています。 私はこれらのsuggesionsを試してみました:

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

私のモデルは、現在のようになります。私はうまく機能していないどのような値を知らない :Prakhar Trivediの者の質問への対応

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 

。私は、djangoがそのデータベーステーブルに値を設定しようとしていることを前提としていました。 「int型のオブジェクトが無属性 'total_seconds'

アドレッシングを持っている:私はget_db_prep_value リターンint型(ラウンド(value.total_seconds()* 1000000)) はAttributeErrorに.......ので のこの印象でいますiklinacの回答:

私は、デフォルト= timedelta(分= 45)を追加しました。私はdatetimeからそれを輸入しているが、私は何かが欠けていると感じる。私はこれで非常に新しいですし、to_python関数を見たことがありません。何が欠けていますか?同じエラーがまだ出ますか?

+0

** value valueは** value ** total_seconds(**)です。どの分野がURモデルの価値ですか? –

+1

ooh @PrakharTrivediそれは私が尋ねる意味だった、それは私が他のものを頼むように思われる:) – e4c5

+0

ちょっとトラビスあなたはあなたのmodels.pyの下で述べたようにインポートtimedeltaを持っていることをチェックしました。 Durationフィールドの後ろにある関数であるto_python関数についても、それを含める必要はありません。最後の部分については、datetimeにまだ問題がある場合は、parse_valueのコメントセクションで以下に述べるdjangoの時刻形式を使用することができます – iklinac

答えて

0

あなたはdatetime型のパッケージからはtimedeltaをインポートしているかどうかを確認してください:)

from datetime import timedelta 

をこれら二つはあなたがいる場合DurationFieldの

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

to_python機能が

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 

に従っている動作するはずですまだtimedeltaに問題がある場合は、pa rse_durationコードコメント

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) 
関連する問題