Определите, изменилась ли модель, перед вызовом сохранения в Django - PullRequest
20 голосов
/ 09 марта 2011

У меня есть модель базы данных, которая обновляется на основе изменений в удаленных данных (с помощью скребка HTML).

Я хочу сохранить поле с именем changed - отметка времени, обозначающая, когда в последний разЗначения модели изменились по сравнению с тем, что было ранее (обратите внимание, что это отличается от auto_now, поскольку эти поля обновляются каждый раз, когда вызывается метод save модели).

Вот мой вопрос:

В методе save модели существует простой способ определить, отличаются ли текущие значения экземпляра модели от значений в базе данных?Или есть какие-то альтернативные методы, позволяющие легко поддерживать отметку времени changed?

Ответы [ 5 ]

34 голосов
/ 09 марта 2011

Если вы сохраните свой экземпляр через форму, вы можете проверить form.has_changed().

10 голосов
/ 09 марта 2011

http://code.activestate.com/pypm/django-dirtyfields/

Отслеживает грязные / измененные поля в экземпляре модели django.

3 голосов
/ 09 марта 2011

Вы можете попытаться вычислить контрольную сумму значений записей при их сохранении.Затем, когда вы прочитаете это позже, пересчитайте контрольную сумму и посмотрите, изменилась ли она.Возможно, функция crc32 в стандартном модуле Python zlib.(Я не уверен, что это будет за производительность. Поэтому, возможно, вы захотите изучить это.)

1 голос
/ 09 марта 2011

Звучит так, как вы хотите: Сигналы: http://docs.djangoproject.com/en/1.2/topics/signals/

Вы можете использовать сигнал post_save, чтобы обновить связанное поле в другой модели, чтобы сохранить предыдущее значение.Тогда на следующем раунде вам будет с чем сравнить.

0 голосов
/ 09 января 2014

В этой библиотеке есть треки FK.

https://github.com/mmilkin/django_dirty_bits

...