首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何知道链式django生命周期挂钩/信号何时完成运行?

如何知道链式django生命周期挂钩/信号何时完成运行?
EN

Stack Overflow用户
提问于 2021-09-20 17:58:28
回答 1查看 232关注 0票数 1

我有一个Animal模型和一个Herd模型,如下所示:

代码语言:javascript
运行
AI代码解释
复制
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,然后你为你想要的最顶端的动物创建你的Herd。然后,Herd的AFTER_CREATE将为Animal的子对象、子对象等创建一个Herd对象的“链”。

例如。

代码语言:javascript
运行
AI代码解释
复制
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

一切都很好。

我的问题在于我的前端,我如何知道所有相关的Animal AFTER_CREATE钩子何时已经运行完毕,以便我知道如何调用我的calculate_total_age方法?

因此,假设我有以下REST端点:

代码语言:javascript
运行
AI代码解释
复制
example.com/api/animals/<pk>
example.com/api/herds/<pk>
example.com/api/herds/<pk>/save_total_age

如果我向example.com/api/herds/<pk>发布一篇文章来创建Herd,那么在创建了“父”Herd之后,我就立即调用save_total_age() --而不一定是在通过AFTER_CREATE钩子创建了所有的“子”Herd之后。

代码语言:javascript
运行
AI代码解释
复制
axios.post(
    "example.com/api/herds/",
    {animal_id: 1}
).then((response) => {
    axios.post(
        `example.com/api/herds/${response.data.pk}/save_total_age`,
        {},
    )
});

如何设置后端信号和/或前端异步/等待,使save_total_age()只在AFTER_CREATE链完成后运行?

编辑:我现在最好的解决方案是向save_word_count()添加一些条件,以确保Herd链具有与Animal链相同的对象#。如果是,运行该方法。如果没有,则返回一个错误的请求并重试POST。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 02:14:03

信号(由这些钩子调用)同步运行,而不是异步运行。因此,当您为第一次听到的消息调用create()时,它将始终运行AFTER_CREATE钩子并在第二个heard对象返回之前创建第二个Heard对象,并让您运行save_total_age()方法。

换句话说,它应该工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69262582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档