Python 为什么赢了';t Django模型';s的时间字段是否按预期正确默认为utcnow()?

Python 为什么赢了';t Django模型';s的时间字段是否按预期正确默认为utcnow()?,python,django,django-models,python-datetime,Python,Django,Django Models,Python Datetime,这是我的模型: class MyModel(models.Model): timeStamp = models.DateTimeField(default=datetime.datetime.utcnow()) def __unicode__(self): return "MyModel ID=%s at <%s %s>" % ( self.id, self.timeStamp.strftime("%H

这是我的模型:

class MyModel(models.Model):
    timeStamp = models.DateTimeField(default=datetime.datetime.utcnow())
    def __unicode__(self):
        return "MyModel ID=%s at <%s %s>" % (
            self.id, 
            self.timeStamp.strftime("%H:%M:%S.000").rstrip("0").rstrip("."), 
            self.timeStamp.strftime("%m/%d/%Y")
        )
类MyModel(models.Model):
timeStamp=models.DateTimeField(默认值=datetime.datetime.utcnow())
def ___; unicode(自):
返回“MyModel ID=%s位于”%(
self.id,
self.timeStamp.strftime(“%H:%M:%S.000”).rstrip(“0”).rstrip(“.”),
self.timeStamp.strftime(“%m/%d/%Y”)
)
看看当我从控制台运行一些命令时会发生什么:

>>> from MyApp.models import *
>>> import datetime

>>> MyModel()
<MyModel: MyModel ID=None at <02:04:45 03/25/2014>>

>>> # Wait several seconds
>>> MyModel()
<MyModel: MyModel ID=None at <02:04:45 03/25/2014>>

>>> # Wait several seconds
>>> MyModel()
<MyModel: MyModel ID=None at <02:04:45 03/25/2014>>


>>> # Wait several seconds
>>> MyModel(timeStamp=datetime.datetime.utcnow())
<MyModel: MyModel ID=None at <02:07:16 03/25/2014>>

>>> # Wait several seconds
>>> MyModel()
<MyModel: MyModel ID=None at <02:04:45 03/25/2014>>

>>> # Wait several seconds
>>> MyModel()
<MyModel: MyModel ID=None at <02:04:45 03/25/2014>>
>>从MyApp.models导入*
>>>导入日期时间
>>>MyModel()
>>>#等几秒钟
>>>MyModel()
>>>#等几秒钟
>>>MyModel()
>>>#等几秒钟
>>>MyModel(timeStamp=datetime.datetime.utcnow())
>>>#等几秒钟
>>>MyModel()
>>>#等几秒钟
>>>MyModel()
为什么timeStamp的默认值(应该为每个MyModel分配给datetime.datetime.utcnow())与我创建的第一个保持不变

只有当我在构造函数中手动设置该值时,它才会改变,这是一个丑陋的攻击


看起来默认值正在缓存并不断重复使用。如何防止这种缓存发生?

因为您已经调用了它。将其作为函数传递

timeStamp = models.DateTimeField(default=datetime.datetime.utcnow)

作品谢谢那么默认值只计算一次,然后缓存?对于您的解决方案,它如何知道不将实际函数utcnow()放入timeStamp变量?它不是计算出来的,只是简单地使用。如果它是可调用的,则每次都调用它,否则使用原始值。