2014-08-27 3 views
0

Я работаю над приложением Django, подключенным к LDAP-серверу. Вот трюк, который я пытаюсь сделать.Вызов функции после сохранения модели

У меня есть модель под названием system, содержащая некоторую информацию о компьютерах. Когда я добавляю новую систему , модель генерирует уникальный UUID, такой как и AutoField. Дело в том, что этот параметр генерируется при сохранении и только в первый раз.
После сохранения мне нужна функция, чтобы сохранить этот UUID и создать новый объект на моем LDAP.
Поскольку я не знаю много о сигналах, я попытался перекрывая модель функцию сохранения следующим образом:

def save(self): 

     # import needed modules 
     import ldap 
     import ldap.modlist as modlist 

     [--OPERATIONS ON THE LDAP--] 

     super(System, self).save() 

Таким образом, если я изменить существующую систему всю работу как следует, потому что его UUID уже создан. Но если я попробую добавить новую систему , то я нахожу ошибку UUID is None, и я не могу работать с пустой переменной на LDAP (также было бы бесполезно, не так ли?)

Это Кажется, мне нужно вызвать функцию, которая работает на LDAP после того, как система сохранена, и поэтому после создания UUID. Я попытался понять, как создать функцию post_save, но я не смог ее получить.
Как я могу это сделать?

Благодаря

ответ

0

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

Обычный подход заключается в размещении сигналов только в конце вашей модели файла:

# Signals 
from django.dispatch import receiver 

@receiver(models.signals.post_save, sender=YourModel) 
def do_something(sender, instance, created, **kwargs): 

    .... 

На приведенном выше примере мы подключаемся сигнал post_save с функцией do_something, это выполняется с помощью декоратора @receiver, отправитель декоратора указывает на ваш модельный класс. Внутри вашей функции есть экземпляр, содержащий текущий экземпляр модели и созданный флагом, который позволяет вам определить, является ли это новой записью или старой (если модель обновляется).

+0

, поэтому я думаю, что могу называть некоторые конкретные атрибуты, используя ** instance.attribute **, как будто это будет ** self.attribute **, или есть другой способ назвать их? –

+0

точно, экземпляр экземпляра модели, как и я в классе модели :) – petkostas

0

Сигналы будет отлично что-то вроде этого, но перемещая линию super(System, self).save() в верхней части метода экономии может работать. Это означает, что сначала вы сохраните экземпляр, прежде чем передавать сохраненный объект в LDAP.

+0

Чем вы. На самом деле я попробовал ваше предложение, и я должен сказать, что он работает! Но я предпочитаю реализовать функцию post_save, работающую таким образом, чтобы разделить разделы операций, а также сохранить код чистым. –

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