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_save
和 post_save
。 Django 按以下顺序调用这些信号:
- 订单 | pre_save
- 订单 | post_save
- 订单行 1 | pre_save
- 订单行 1 | post_save
- 订单行 2 | pre_save
- 订单行 2 | post_save
- 订单行n | pre_save
- 订单行n | post_save
我遇到的问题是我想改变调用信号的顺序,如下:
- 订单 | pre_save
- 订单行 1 | pre_save
- 订单行 1 | post_save
- 订单行 2 | pre_save
- 订单行 2 | post_save
- 订单行n | pre_save
- 订单行n | post_save
- 订单 | 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
所有相关对象更新后调用。
我有一个 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_save
和 post_save
。 Django 按以下顺序调用这些信号:
- 订单 | pre_save
- 订单 | post_save
- 订单行 1 | pre_save
- 订单行 1 | post_save
- 订单行 2 | pre_save
- 订单行 2 | post_save
- 订单行n | pre_save
- 订单行n | post_save
我遇到的问题是我想改变调用信号的顺序,如下:
- 订单 | pre_save
- 订单行 1 | pre_save
- 订单行 1 | post_save
- 订单行 2 | pre_save
- 订单行 2 | post_save
- 订单行n | pre_save
- 订单行n | post_save
- 订单 | 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
所有相关对象更新后调用。