Сохранение объекта модели в django не выдает ошибку, но значение атрибута не меняется - PullRequest
0 голосов
/ 12 апреля 2010

Я получаю объект модели, меняю атрибут, сохраняю его, и он все еще имеет старый атрибут:

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

Кто-нибудь знает, если это проблема с базой данных или что-то еще?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2010

Я понял это.

Проблема заключалась в том, что поле 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)

все работает, просто отлично :) 1033 *

>>> 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 голосов
/ 12 апреля 2010

Возможно, вы установили DISABLE_TRANSACTION_MANAGEMENT на False:

Как говорит Джанго :

Если вы сделаете это, Django не обеспечит никакого автоматического управления транзакциями. Промежуточное программное обеспечение больше не будет неявно фиксировать транзакции, и вам нужно будет самостоятельно свернуть управление. Это даже требует, чтобы вы зафиксировали изменения, сделанные промежуточным программным обеспечением где-то еще.

0 голосов
/ 12 апреля 2010

Пожалуйста, проверьте документ django для автоматической фиксации. Я предполагаю, что вы должны включить автоматическую фиксацию, чтобы принять изменения немедленно.

...