Сигнал предварительного сохранения Django

У меня есть сигнал предварительного сохранения для одной из моих моделей. Этот сигнал предварительного сохранения выполняет некоторые фоновые действия API, чтобы синдицировать новые и обновленные объекты поставщикам услуг и возвращать нам бессмысленные данные для хранения в качестве ссылок вместо исходных данных.

Методы new и update различаются в API.

В идеале, если бы пользователь выполнял обновление, он удалял бы бессмысленные данные из поля и печатал их. Мой сигнал должен знать, какие поля были обновлены, чтобы отправлять изменения только для этих полей, поскольку отправка всех полей в обновлении будет отправлять бессмысленные ссылки в качестве необработанных данных в дополнение к обновлениям.

Сигнал предварительного сохранения имеет аргумент update_fields. Я искал некоторые детали и обнаружил, что этот аргумент может включать все поля при выполнении обновления.


Относительно update_fields поскольку в документации мало информации по этому поводу

  • При создании объекта что-нибудь передается в update_fields?
  • При обновлении объекта все поля передаются в update_fields или только те, которые были обновлены?

Есть ли другие предложения о том, как решить эту проблему? Я знаю, что post_save имеет аргумент created, но я бы предпочел работать с данными до их сохранения.


person henryaaron    schedule 26.07.2016    source источник


Ответы (1)


При создании объекта что-нибудь передается в update_fields?

Нет.

При обновлении объекта все поля передаются в update_fields или только те, которые были обновлены?

Зависит от того, кто вызывает метод save(). По умолчанию Django не устанавливает update_fields. Если ваш код не вызовет save() с набором аргументов update_fields, он перезапишет все поля в базе данных, и сигнал pre_save увидит update_fields=None.

Мой сигнал должен знать, какие поля были обновлены, чтобы отправлять изменения только для этих полей.

Если вы не контролируете, что вызывает метод save() для объекта, вы не получите эту информацию с помощью update_fields. Цель этого аргумента не в том, чтобы позволить вам отслеживать, какие поля были изменены, а в том, чтобы облегчить эффективную запись данных, когда вы знаете, что нужно записать только определенные столбцы в базе данных.

person solarissmoke    schedule 26.07.2016