gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:31:22 25 4
gpt4 key购买 nike

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

简化成这样:

   class OrderLine(admin.StackedInline):
pass

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

我注册了 pre_savepost_save在两种型号上。 Django 按以下顺序调用这些信号:
  • 订购 |预存
  • 订购 | post_save
  • 订单行 1 |预存
  • 订单行 1 | post_save
  • 订单行 2 |预存
  • 订单行 2 | post_save
  • 订单行 n |预存
  • 订单行 n | post_save

  • 问题 我的想法是我想更改调用信号的顺序,如下所示:
  • 订购 |预存
  • 订单行 1 |预存
  • 订单行 1 | post_save
  • 订单行 2 |预存
  • 订单行 2 | post_save
  • 订单行 n |预存
  • 订单行 n | post_save
  • 订购 | post_save

  • 因为我需要在每个 OrderLine 中做一些计算,并且这些结果需要用于 Order邮政。但是 post signal已经被调用了。

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

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

    最佳答案

    我一直在回避,认为你应该通过 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

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

    关于Django 更改使用内联时调用的 pre_save post_save 信号的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59355951/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com