如何知道链式 django 生命周期 hooks/signals 何时完成 运行?
How to know when chained django lifecycle hooks/signals are finished running?
我有一个 Animal
模型和一个 Herd
模型,如下所示:
from django_lifecycle.hooks import AFTER_CREATE
class Animal(models.Model):
parent = OneToOneField("self", related_name="child")
age = IntegerField()
class Herd(models.Model):
animal = OneToOneField(Animal)
total_age = IntegerField()
@hook(AFTER_CREATE)
def create_animal_child(self):
if self.animal.child.exists():
Herd.objects.create(parent=self, animal=self.animal.child)
def save_total_age(self):
total_age = self.animal.age
position = self.animal
while position.child.exists():
total_age += position.child.age
position = position.child
想法是您创建 Animal
s。然后你为你想要的最上面的动物创建你的Herd
。 The Herd 的 AFTER_CREATE
将为 Animal
的 children、children 的所有 Herd
objects 创建一个“链” children,依此类推。
例如
a1 = Animal.objects.create(age=10)
a2 = Animal.objects.create(parent=a1, age=7)
a3 = Animal.objects.create(parent=a2, age=3)
h1 = Herd.objects.create(animal=a1)
# Two Herd objects with an "animal" field pointing to a2 and a3 respectively are automatically created
h1.save_total_age() # h1.total_age = 20 # 10 + 7 + 3
没问题。
我的问题是我的 front-end,我怎么知道所有相关的 Animal
AFTER_CREATE
挂钩何时完成 运行ning 所以我知道调用我的 calculate_total_age
方法?
假设我有以下 REST API 端点:
example.com/api/animals/<pk>
example.com/api/herds/<pk>
example.com/api/herds/<pk>/save_total_age
如果我执行 POST 到 example.com/api/herds/<pk>
来创建 Herd
,我会尽快调用 save_total_age()
“parent” Herd
被创建 - 并且不一定在所有“children” Herd
s 已经通过 AFTER_CREATE
钩子创建之后。
axios.post(
"example.com/api/herds/",
{animal_id: 1}
).then((response) => {
axios.post(
`example.com/api/herds/${response.data.pk}/save_total_age`,
{},
)
});
如何设置我的后端信号 and/or 前端 async/await 以便 save_total_age()
仅 运行s 在 我的 AFTER_CREATE
链完成了吗?
编辑:我现在最好的解决方案是向 save_word_count()
添加一些条件,以确保 Herd
链具有与 Animal
相同的 objects #链。如果是这样,运行 方法。如果不是,return 一个错误的请求并重试 POST。
信号(由那些挂钩调用)运行 同步,而不是异步。所以当你为你的第一个 heard 调用 create()
时,它总是 运行 AFTER_CREATE
挂钩并创建第二个 Heard 对象,在它之前 returns 让你 运行 save_total_age()
方法。
换句话说,这应该可以正常工作。
我有一个 Animal
模型和一个 Herd
模型,如下所示:
from django_lifecycle.hooks import AFTER_CREATE
class Animal(models.Model):
parent = OneToOneField("self", related_name="child")
age = IntegerField()
class Herd(models.Model):
animal = OneToOneField(Animal)
total_age = IntegerField()
@hook(AFTER_CREATE)
def create_animal_child(self):
if self.animal.child.exists():
Herd.objects.create(parent=self, animal=self.animal.child)
def save_total_age(self):
total_age = self.animal.age
position = self.animal
while position.child.exists():
total_age += position.child.age
position = position.child
想法是您创建 Animal
s。然后你为你想要的最上面的动物创建你的Herd
。 The Herd 的 AFTER_CREATE
将为 Animal
的 children、children 的所有 Herd
objects 创建一个“链” children,依此类推。
例如
a1 = Animal.objects.create(age=10)
a2 = Animal.objects.create(parent=a1, age=7)
a3 = Animal.objects.create(parent=a2, age=3)
h1 = Herd.objects.create(animal=a1)
# Two Herd objects with an "animal" field pointing to a2 and a3 respectively are automatically created
h1.save_total_age() # h1.total_age = 20 # 10 + 7 + 3
没问题。
我的问题是我的 front-end,我怎么知道所有相关的 Animal
AFTER_CREATE
挂钩何时完成 运行ning 所以我知道调用我的 calculate_total_age
方法?
假设我有以下 REST API 端点:
example.com/api/animals/<pk>
example.com/api/herds/<pk>
example.com/api/herds/<pk>/save_total_age
如果我执行 POST 到 example.com/api/herds/<pk>
来创建 Herd
,我会尽快调用 save_total_age()
“parent” Herd
被创建 - 并且不一定在所有“children” Herd
s 已经通过 AFTER_CREATE
钩子创建之后。
axios.post(
"example.com/api/herds/",
{animal_id: 1}
).then((response) => {
axios.post(
`example.com/api/herds/${response.data.pk}/save_total_age`,
{},
)
});
如何设置我的后端信号 and/or 前端 async/await 以便 save_total_age()
仅 运行s 在 我的 AFTER_CREATE
链完成了吗?
编辑:我现在最好的解决方案是向 save_word_count()
添加一些条件,以确保 Herd
链具有与 Animal
相同的 objects #链。如果是这样,运行 方法。如果不是,return 一个错误的请求并重试 POST。
信号(由那些挂钩调用)运行 同步,而不是异步。所以当你为你的第一个 heard 调用 create()
时,它总是 运行 AFTER_CREATE
挂钩并创建第二个 Heard 对象,在它之前 returns 让你 运行 save_total_age()
方法。
换句话说,这应该可以正常工作。