Django 更改使用内联时调用的 pre_save post_save 信号的顺序?

Django change the order of pre_save post_save signals being called when using inlines?

我有一个 Order (1) 和 OrderLine (n) 模型,这里的订单可以有多个订单行。这是来自 Django-admin 内部的 all 运行,其中 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 中使用.但是 post signal 已经被调用了。

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

解决此问题的最佳/更好方法是什么?

我跑偏了,觉得你应该通过signals解决这个问题。

显然您可以(并且应该)在您的 admin class (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

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