2014-01-27 2 views
3

У меня есть модель, на которой мне нужно редактировать объекты с учетом определенных состояний.Правильный способ повторного сохранения объекта?

Использование сигналов post_save Я могу определить заданное состояние и оттуда запустить указанный метод (ы).

Моя проблема в том, что в этих методах мне нужно сохранить объект после редактирования, вызывая бесконечный цикл сохранения. Есть ли «правильный путь» для обработки подобной ситуации или существуют только плохие или худшие виды обходных решений?

ответ

2

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

Внутри вашего метода, подключенного к сигналу:

signals.post_save.disconnect(YourModel.your_custom_method, sender=YourModel) 

# Do your stuff 

instance.save() 

signals.post_save.connect(YourModel.your_custom_method, sender=YourModel) 

Примечание: Я использую «YourModel.your_custom_method, потому что я, как правило, размещать его внутри модели, это, очевидно, не является обязательным

EDIT:.

Этот вопрос SO приносит использование update() вместо save() как более чистый способ, это может быть то, что вы ищете.

Django post_save preventing recursion without overriding model save()

Хотя это может быть чище, я бы не думать о нем, как идеальное решение, если должным образом не удалось с кэшированием, так как вы будете вынуждены поразить базу данных, чтобы получить QuerySet в то время как у вас уже есть экземпляр в ваших руках в качестве аргумента сигнала ...

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

Надеется, что это помогает,

С уважением,

+0

Спасибо, но жаль, возможно, я хотел бы упомянуть, мой взгляд на плохих обходных путях. Это не кажется мне самым прямым способом? – BSG

+0

У меня нет проблем с размещением его внутри модели, а наоборот. Это отключение сигналов, которые действительно кажутся выше, но это считается «правильным» способом обращения с ним? – BSG

+0

Ну, некоторые люди склонны не одобрять использование сигналов вместо переопределения save(), и пока я этого не делаю, отключение/повторное подключение - это, насколько мне известно, единственный способ, кроме сохранения() переопределения, чтобы обойти спасительные циклы. В документах он явно не описан как таковой, но опять же, ничего другого в этом вопросе нет. – Ambroise

Смежные вопросы