2013-04-11 1 views
4

У меня есть REST API, построенный с использованием Django и TastyPie. Моя цель - добавить задачу в очередь на работу, когда новые данные отправляются в определенную модель.Django TastyPie, как вызвать действие после POST с помощью ManyToMany полей?

Я собирался подключиться к post_save и запускать затем, но модель содержит отношения ManyToMany, поэтому post_save запускается до обновления m2m-отношений и подключения к сигналу m2m_changed кажется беспорядочным. Я получаю несколько событий сигнала, и мой код должен будет проверить экземпляр после каждого из них и попытаться определить, готов ли он к запуску события. Некоторые из полей ManyToMany могут быть нулевыми, поэтому, когда я получаю сигнал m2m_changed, я действительно не знаю точно, если это сделано с сохранением.

Есть ли правильный способ сделать это? Позволяет ли TastyPie подключаться к событию POST и делать что-то в конце? Все, что я нашел, указывает мне на события post_save, чтобы сделать это.

У Django есть способ сообщить мне, когда все обновления m2m для экземпляра данной модели завершены?

+0

Я нашел более менее неприятный способ сделать это, переопределив метод tastypie create_response(), который вызывается после сохранения всех моделей. Мне все равно это не нравится. –

+0

Я также попытался использовать wrap_view, но для этого требуется, чтобы я повторно проанализировал содержимое ответа, чтобы получить идентификатор только что созданного объекта. Кажется очень неэффективным. –

ответ

7

Если вы используете POST, то obj_update() не кажется, работает для меня. Что же работа с использованием obj_create() следующим образом:

class Resource(ModelResource): 
    def obj_create(self,bundle,**kwargs): 
     bundle = super(Resource,self).obj_create(bundle,**kwargs) 

     # Add code here 

     return bundle 

Одна вещь, чтобы отметить, что request не входит. Я попробовал это, и это дало мне ошибку.

+1

Вы можете получить запрос изнутри пакета. bundle.request отлично работает для меня. –

6

Вы должны быть в состоянии, чтобы переопределить obj_update методу

class Resource(ModelResource): 
    def obj_update(self, bundle, request, **kwargs): 
     bundle = super(Resource, self).obj_update(bundle, **kwargs) 

     # queue your task here 
     return bundle 

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

  • Нет связанных вопросов^_^