【问题标题】:Django change the order of pre_save post_save signals being called when using inlines?Django更改使用内联时调用pre_save post_save信号的顺序?
【发布时间】:2020-04-08 21:02:38
【问题描述】:

我有一个Order (1) 和OrderLine (n) 模型,这里的订单可以有多个订单行。这全部运行在 Django-admin 内部,OrderLine 被设置为OrderAdmin(admin.ModelAdmin) 上的inlines 的一部分。

简化如下:

   class OrderLine(admin.StackedInline):
     pass

   @admin.register(Order)
   class OrderAdmin(admin.ModelAdmin):
     inlines = [OrderLine]

我在两种型号上都注册了pre_savepost_save。 Django 按以下顺序调用这些信号:

  1. 订购 | pre_save
  2. 订购 | post_save
  3. 订单行 1 | pre_save
  4. 订单行 1 | post_save
  5. 订单行 2 | pre_save
  6. 订单行 2 | post_save
  7. 订单行n | pre_save
  8. 订单行n | post_save

我遇到的问题是我想更改调用信号的顺序,如下所示:

  1. 订购 | pre_save
  2. 订单行 1 | pre_save
  3. 订单行 1 | post_save
  4. 订单行 2 | pre_save
  5. 订单行 2 | post_save
  6. 订单行n | pre_save
  7. 订单行n | post_save
  8. 订购 | post_save

因为我需要在每个OrderLine 中进行一些计算,并且这些结果需要在Order 帖子中使用。但是post signal 已经被调用了。

我看到的唯一解决方案是在每个 OrderLine post signal 上调用我的代码,这有点多余,尤其是当您有很多订单行时。

解决这个问题最好/更好的方法是什么?

【问题讨论】:

  • 你可以在Orderpre_save信号中调用保存OrderLine1,2,N
  • @SergeyPugach 不确定您的意思,您如何在pre_save 中保存订单行?当我在Order 中使用post_save 时,我仍然看到每个OrderLine 的旧数据。所以这不起作用,这是有道理的,因为我可以看到在保存 Order 后订单行已更新。
  • 您能否在模型中添加代码以及现在保存 Order 和 OrderLine 的那部分代码&
  • @SergeyPugach 好吧,我认为这没什么用。这是在admin.ModelAdmin 中运行的,所以代码不多。除了pre_savepost_save 的两个函数。我会更新我的问题,因为这是相关的。
  • 你分享了来自admin.py的内容,但我从models.py询问了你的模型。

标签: django django-models django-admin django-signals


【解决方案1】:

我被转移了,认为你应该通过signals 解决这个问题。

显然您可以(并且应该)在您的 admin 类 (admin.ModelAdmin) 中实现以下方法:

 # example
 def save_related(self, request, form, formsets, change):
    super(OrderAdmin, self).save_related(request, form, formsets, change)
    # get the master obj
    order = form.instance
    order.total = Decimal.from_float(0.0)
    for ol in order.order_lines.all():
        order.total += ol.total order.total

在所有相关对象更新后调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2018-08-09
    • 2014-03-16
    • 2017-10-10
    • 2013-07-12
    • 2010-11-02
    • 2011-05-30
    • 2010-11-16
    相关资源
    最近更新 更多