Python heroku应用程序中新对象的时间戳设置为heroku';s服务器启动时间,而不是实际utcnow时间

Python heroku应用程序中新对象的时间戳设置为heroku';s服务器启动时间,而不是实际utcnow时间,python,django,postgresql,heroku,Python,Django,Postgresql,Heroku,我在heroku上有一个应用程序为新对象设置了不正确的时间戳。我不明白为什么,为了我的生命 发生了什么: 我正在heroku run网站上提交一份表格 Django视图创建新对象并保存 models.py具有“ts=models.DateTimeField(默认值=datetime.now(utc)),因此它应该在提交时保存utc时间戳(在本地保存),但在heroku上,它保存服务器启动时的时间戳 Models.py: class NewsArticle(models.Model): l

我在heroku上有一个应用程序为新对象设置了不正确的时间戳。我不明白为什么,为了我的生命

发生了什么:

  • 我正在heroku run网站上提交一份表格

  • Django视图创建新对象并保存

  • models.py具有“ts=models.DateTimeField(默认值=datetime.now(utc)),因此它应该在提交时保存utc时间戳(在本地保存),但在heroku上,它保存服务器启动时的时间戳

  • Models.py:

    class NewsArticle(models.Model):
        link = models.URLField(max_length = 2000)
        title = models.CharField(max_length = 300)
        img_path = models.CharField(null = True, max_length = 300)
        ts = models.DateTimeField(default = datetime.now(utc))
        user = models.ForeignKey(User)
        hostname = models.CharField(max_length = 300)
        deleted = models.BooleanField(default = False)
    
    Views.py:

    news_article = NewsArticle(...)
    news_article.save()
    
    print news_article.ts
    print datetime.now(utc)
    import sys
    sys.stdout.flush()
    
    heroku日志中相应的输出(我在UTC 22:00:34重新启动了heroku服务器):

    15分钟后再次:

    2013-01-02T22:15:46+00:00 app[web.1]: 2013-01-02 22:00:34.746547+00:00
    2013-01-02T22:15:46+00:00 app[web.1]: 2013-01-02 22:15:46.489815+00:00
    

    显然,datetime.now(utc)调用在models.py中发生了错误,但我不确定原因。有人有主意吗?

    您的问题可能在于如何设置默认值。以下两组代码相同:

    now_at_import = datetime.now(utc)
    MyModel
      ...
      ts = models.DateTimeField(default = now_at_import)
    
    #is exactly the same as
    MyModel
      ...
      ts = models.DateTimeField(default = datetime.now(utc))
    
    你想要的是:

    def get_utc_now():
      return datetime.now(utc)
    
    
    MyModel
      ...
      ts = models.DateTimeField(default = get_utc_now)
    

    我的猜测是,它与此相关:-因此,每个实例启动时都不会挂起,并且您必须明确地让它获得时间…啊,您是对的。这就解决了问题。谢谢。不能说我很快就能得到。
    def get_utc_now():
      return datetime.now(utc)
    
    
    MyModel
      ...
      ts = models.DateTimeField(default = get_utc_now)