Django: При сохранении, как можно проверить, изменилось ли поле?

Ну, это действительно зависит, на котором EJBs мы говорим о. Я сказал бы, что MDBs может все еще быть полезным даже сейчас. Для компонентов сущности и бобов сессии можно, конечно, найти лучший подход. Возможно, одна функция, которая я все еще как в EJBs являюсь масштабируемостью. Используя "удаленную" опцию можно развернуть EJBs на различных серверах при необходимости. Однако я не думаю, что это действительно необходимо, и я видел только один огромный проект, где это было действительно полезно.

273
задан Paul Tarjan 30 August 2009 в 12:43
поделиться

4 ответа

Хотя уже немного поздно, позвольте мне предложить это решение другим, кто наткнулся на этот пост. По сути, вы хотите переопределить метод __ 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
405
ответ дан 23 November 2019 в 02:12
поделиться

Хотя это на самом деле не отвечает на ваш вопрос, я бы сделал это по-другому.

Просто очистите поле remote_image после успешного сохранения локального копировать. Затем в вашем методе сохранения вы всегда можете обновить изображение, когда remote_image не пуст.

Если вы хотите сохранить ссылку на URL-адрес, вы можете использовать нередактируемое логическое поле для обрабатывать флаг кеширования, а не само поле remote_image .

2
ответ дан 23 November 2019 в 02:12
поделиться

А теперь прямой ответ: один из способов проверить, изменилось ли значение поля, - это получить исходные данные из базы данных перед сохранением экземпляра. Рассмотрим следующий пример:

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 = []
135
ответ дан 23 November 2019 в 02:12
поделиться

в качестве расширения ответа SmileyChris, вы можете добавить поле datetime в модель для last_updated и установить какой-то предел для максимального возраста, который вы позволите ему достичь, прежде чем проверять изменение

0
ответ дан 23 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: