【问题标题】:Saving model object in django throws no error but attribute value doesn't change在 django 中保存模型对象不会引发错误,但属性值不会改变
【发布时间】:2011-02-06 19:55:14
【问题描述】:

我得到一个模型对象,更改一个属性,保存它,它仍然具有旧属性:

>>> 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)

有人知道这是数据库问题还是其他问题?

【问题讨论】:

    标签: django models save


    【解决方案1】:

    我想通了。

    问题是 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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        也许您已将DISABLE_TRANSACTION_MANAGEMENT 设置为False

        正如Django 所说:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-01
          • 2013-07-09
          • 2013-10-19
          • 1970-01-01
          相关资源
          最近更新 更多