2010-04-11 25 views
0

我得到一个模型对象,更改属性,保存它,它仍然具有旧的属性:保存模型对象不引发错误,但属性值不改变

>>> g = SiteProfile.objects.get(pk=3) 
>>> g.renew_date 
datetime.date(2010, 4, 11) 
>>> g.renew_date = date.today()+timedelta(days=365) 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
>>> g.save() 
>>> g.renew_date 
datetime.datetime(2010, 4, 11, 16, 57, 4, 192684) 

任何人都知道,如果这是数据库还是其他问题?

+0

发表您的模型 – 2010-04-12 00:50:06

回答

2

我想通了。

的问题是,该场renew_date有争论auto_now设置为True这样:

renew_date = models.DateField(auto_now=True, editable=False) 

我理解auto_now意味着将当前日期创建对象时,可以使用,但事实证明,这是并非如此:

DateField.auto_now

自动设置 现在每次保存对象 。适用于“最后修改” 时间戳。请注意,总是使用当前日期 ;这不仅是您可以覆盖的默认值 。

django docs

我需要的是auto_now_add其中:

自动设置领域到现在 首先创建对象时。 用于创建时间戳。 请注意,当前日期始终使用 ;这不仅是您可以覆盖的默认值 。

所以,改变了我的renew_date后场:

renew_date = models.DateField(auto_now_add=True, editable=False) 

所有的工作,就好:)

>>> g = SelectStatProfile.objects.get(pk=3) 
>>> g.renew_date 
datetime.date(2010, 4, 11) 
>>> from datetime import date, timedelta 
>>> g.renew_date = date.today()+timedelta(days=365) 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
>>> g.save() 
>>> g.renew_date 
datetime.date(2011, 4, 11) 
0

请检查自动提交的django文档。我想你必须启用自动提交才能立即接受更改。

0

也许你已经设置DISABLE_TRANSACTION_MANAGEMENTFalse

正如Django说:

如果你这样做,Django的将不提供任何自动的事务管理。中间件将不再隐式地提交事务,并且您需要自己进行卷管理。这甚至需要你提交其他地方的中间件所做的更改。