【问题标题】:'datetime.date' object has no attribute 'date''datetime.date' 对象没有属性 'date'
【发布时间】:2010-09-09 13:08:56
【问题描述】:

这段代码:

import datetime
d_tomorrow = datetime.date.today() + datetime.timedelta(days=1)

class Model(models.Model):
    ...
    timeout = models.DateTimeField(null=True, blank=True, default=d_tomorrow)
    ...

导致此错误:

'datetime.date' object has no attribute 'date'

我做错了什么?

【问题讨论】:

    标签: django datetime django-models


    【解决方案1】:

    Django ORM 期望d_tomorrow 具有date 属性(显然),但没有。

    无论如何,您可能希望对默认日期使用可调用对象;否则,每个模型的默认日期将是相对于模型类初始化时间的“明天”,而不是模型创建时间。你可以试试这个:

    import datetime
    
    def tomorrow():
      return datetime.date.today() + datetime.timedelta(days=1)
    
    class Model(models.Model):
      timeout = models.DateTimeField(null=True, blank=True, default=tomorrow)
    

    【讨论】:

      【解决方案2】:

      问题解决了:

      from datetime import datetime, time, date, timedelta
      def tomorrow():
          d = date.today() + timedelta(days=1)
          t = time(0, 0)
          return datetime.combine(d, t)
      

      models.DateTimeField 期望值为datetime.datetime,而不是datetime.date

      2015 年更新:

      Arrow 让这一切变得更加直接。

      Arrow 是一个 Python 库,它提供了一种明智、人性化的方法来创建、操作、格式化和转换日期、时间和时间戳。它实现并更新了 datetime 类型,填补了功能上的空白,并提供了一个支持许多常见创建场景的智能模块 API。简而言之,它可以帮助您以更少的导入和更少的代码处理日期和时间。

      Arrow 深受 moment.js 和 requests 的启发。

      【讨论】:

        【解决方案3】:

        我在使用来自 django.contrib.admin 的模型时遇到了这个问题。我有两个类似的模型,都有一个日期字段(并且都使用 auto_now_date=True - 完全红鲱鱼);一个工作,一个有这个错误。

        原来是

        def __unicode__(self):
            return self.date
        

        砰的一声,而这

        def __unicode__(self):
            return u'%s' % self.date
        

        工作得很好。像往常一样,这在活动结束后很明显。

        【讨论】:

          【解决方案4】:

          这对我有用:

          import datetime
          from datetime import timedelta
          
          tomorrow = datetime.date.today() + timedelta(days=1)
          
          class Test(models.Model):
              timeout = models.DateTimeField(db_index=True, default=tomorrow)
          

          您也可以使用tomorrow = datetime.datetime.now() + timedelta(days=1)

          【讨论】:

          • 仍然,同样的错误。不,我不能使用它,因为我不想要时间。
          【解决方案5】:

          我试用了您的代码,它运行良好。您能否确认您没有以某种方式修改/重新定义导入?

          也试试这个:

          import datetime as DT
          d_tomorrow = DT.date.today() + DT.timedelta(days=1)
          
          class Model(models.Model):
              timeout = models.DateTimeField(null=True, blank=True, default=d_tomorrow)
          

          【讨论】:

          • 我看不出它是如何重复的,原因有两个。 (1) 我问了一个关于重新定义导入的合理问题/提示。 (2)我给的代码sn -p不一样。
          猜你喜欢
          • 2022-11-28
          • 2022-01-24
          • 2016-09-29
          • 2014-01-16
          • 2019-03-18
          • 1970-01-01
          • 2021-05-26
          • 1970-01-01
          • 2020-01-25
          相关资源
          最近更新 更多