Ну, это действительно зависит, на котором EJBs мы говорим о. Я сказал бы, что MDBs может все еще быть полезным даже сейчас. Для компонентов сущности и бобов сессии можно, конечно, найти лучший подход. Возможно, одна функция, которая я все еще как в EJBs являюсь масштабируемостью. Используя "удаленную" опцию можно развернуть EJBs на различных серверах при необходимости. Однако я не думаю, что это действительно необходимо, и я видел только один огромный проект, где это было действительно полезно.
Хотя уже немного поздно, позвольте мне предложить это решение другим, кто наткнулся на этот пост. По сути, вы хотите переопределить метод __ init __
для models.Model
, чтобы сохранить копию исходного значения. Благодаря этому вам не придется выполнять еще один поиск в БД (что всегда хорошо).
class Person(models.Model):
name = models.CharField()
__original_name = None
def __init__(self, *args, **kwargs):
super(Person, self).__init__(*args, **kwargs)
self.__original_name = self.name
def save(self, force_insert=False, force_update=False, *args, **kwargs):
if self.name != self.__original_name:
# name changed - do something here
super(Person, self).save(force_insert, force_update, *args, **kwargs)
self.__original_name = self.name
Хотя это на самом деле не отвечает на ваш вопрос, я бы сделал это по-другому.
Просто очистите поле remote_image
после успешного сохранения локального копировать. Затем в вашем методе сохранения вы всегда можете обновить изображение, когда remote_image
не пуст.
Если вы хотите сохранить ссылку на URL-адрес, вы можете использовать нередактируемое логическое поле для обрабатывать флаг кеширования, а не само поле remote_image
.
А теперь прямой ответ: один из способов проверить, изменилось ли значение поля, - это получить исходные данные из базы данных перед сохранением экземпляра. Рассмотрим следующий пример:
class MyModel(models.Model):
f1 = models.CharField(max_length=1)
def save(self, *args, **kw):
if self.pk is not None:
orig = MyModel.objects.get(pk=self.pk)
if orig.f1 != self.f1:
print 'f1 changed'
super(MyModel, self).save(*args, **kw)
То же самое применяется при работе с формой. Вы можете обнаружить это с помощью метода очистки или сохранения ModelForm:
class MyModelForm(forms.ModelForm):
def clean(self):
cleaned_data = super(ProjectForm, self).clean()
#if self.has_changed(): # new instance or existing updated (form has data to save)
if self.instance.pk is not None: # new instance only
if self.instance.f1 != cleaned_data['f1']:
print 'f1 changed'
return cleaned_data
class Meta:
model = MyModel
exclude = []
в качестве расширения ответа SmileyChris, вы можете добавить поле datetime в модель для last_updated и установить какой-то предел для максимального возраста, который вы позволите ему достичь, прежде чем проверять изменение