【问题标题】:Django TastyPie, how to trigger action after POST with ManyToMany fields?Django TastyPie,如何在使用 ManyToMany 字段的 POST 后触发操作?
【发布时间】:2013-04-03 22:12:46
【问题描述】:

我有一个使用 Django 和 TastyPie 构建的 REST API。我的目标是在将新数据发布到特定模型时将任务添加到我的作业队列中。

我本来打算挂接到 post_save 并触发,但模型包含 ManyToMany 关系,因此在 m2m 关系更新之前触发 post_save 并挂接到 m2m_changed 信号似乎很混乱。我收到多个信号事件,我的代码需要在每个信号事件之后检查实例并尝试确定它是否已准备好触发事件。一些 ManyToMany 字段可以为 Null,因此当我收到 m2m_changed 信号时,我并不确定它是否已完成保存。

有没有正确的方法来做到这一点? TastyPie 是否允许我加入 POST 事件并在最后做点什么?我发现的所有事情都指向我在 post_save 事件中执行此操作。

当给定模型实例的所有 m2m 更新完成时,Django 是否有办法向我发出信号?

【问题讨论】:

  • 我发现了一种稍微不那么令人不快的方法,方法是覆盖所有模型保存后调用的 sweetpie create_response() 方法。我还是不喜欢。
  • 我也尝试使用 wrap_view,但这需要我重新解析响应的内容以获取刚刚创建的对象的 ID。看起来效率很低。

标签: django tastypie


【解决方案1】:

如果您使用的是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 不包括在内。我试过了,它给了我一个错误。

【讨论】:

  • 您可以从包中获取请求。 bundle.request 对我来说工作正常。
【解决方案2】:

您应该能够覆盖 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 2012-03-13
    • 2012-11-04
    • 2010-11-14
    • 2016-09-17
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多