Django - Разница между администратором save_model () и сигналом post_save - PullRequest
0 голосов
/ 23 февраля 2019

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

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

  1. Использование сигнала post_save
  2. Перезаписать метод save_model в admin.py, поскольку в документации сказано, что «Переопределение этого метода позволяет выполнять до или послеоперации сохранения. "

В настоящее время я использую последнее таким образом

def save_model(self, request, obj, form, change):

    #some pre save operations....

    #this call the save model method
    super(MyModelAdmin, self).save_model(request, obj, form, change)

    #some post save operations...

, и оно работает

Но я хочу понять следующее:

  1. Для того, что я должен сделать, каковы различия между этими двумя подходами и что является наиболее правильным.
  2. Связан ли метод save_model с использованием интерфейса администратора?Что произойдет, если я использую другой интерфейс, отличный от администратора Django?
  3. В общем, в чем разница между выполнением операций сохранения до и после перезаписи save_model и использованием сигналов?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Я думаю, вы поняли это правильно.И это может помочь вам понять разницу.

save_model метод из ModelAdmin вызывается, когда вы пытаетесь создать или обновить что-то из только администратор django , но срабатывают сигналы независимо от места, где произошли действия.Это означает, что операции pre или post в методе save_model не будут работать, если вы измените модель из-за пределов django admin , но сигналы будут работать для обоих извнеадминистративные представления и из ваших пользовательских блоков письменного кода.

0 голосов
/ 23 февраля 2019

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

Мы можем создать нового пользователя в админке Django и использовать метод saved_model в ModelAdmin, чтобы сохранить другие части формы в модели Profile.Это «нормальный» способ сделать это.Но, используя этот способ, вы можете получить доступ к пользователю и профилю только из панели администратора Django.Форма «Регистрация пользователя» вне Администратора Django будет не работать, так как для доступа к элементам управления администратора Django Пользователю придется зарегистрироваться.

Но с использованием post_save сигнал, новый пользователь и профиль могут быть созданы и обновлены независимо от того, используете ли вы панель администратора Django или пользовательскую форму, которая сохраняется в моделях User и Profile.

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

0 голосов
/ 23 февраля 2019

Если возможно, я бы предпочел добавить сигналы вместо перезаписи save_model.Сигналы позволяют определенным отправителям уведомлять группу получателей о том, что какое-то действие имело место.Они особенно полезны, когда многие фрагменты кода могут интересоваться одними и теми же событиями.Также это похоже на событийное программирование парадигма.Это помогает сделать код организованным и чистым.

...