我有一個Animal模型和一個Herd模型,看起來像這樣:
from django_lifecycle.hows import AFTER_CREATE
class Animal(models.Model)。
parent = OneToOneField("self"/span>, related_name="child"/span>)
age = IntegerField()
class Herd(models.Model)。
animal = OneToOneField(Animal)
total_age = IntegerField()
@hook(AFTER_CREATE)/span>
def create_animal_child(self)。
if self.animal.child.existence()。
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.existence():
total_age = position.child.age
position = position.child
這個想法是,你創建你的Animals。然后你為你想要的最上面的動物創建你的Herd。Herd的AFTER_CREATE將創建一個所有Herd物件的 "鏈",用于Animal的孩子,孩子的孩子,以此類推。
例如:
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)
# 自動創建兩個牧群物件,其 "動物 "欄位分別指向a2和a3。
h1.save_total_age() # h1.total_age = 20 # 10 7 3
這一切都很好。
。我的問題是,對于我的前端,我如何知道所有相關的Animal AFTER_CREATE鉤子何時完成運行,以便我知道呼叫我的calculate_total_age方法?
因此,我有以下的REST API端點:
我有以下的REST API端點。
example.com/api/animals/<pk>
example.com/api/herds/<pk>
example.com/api/herds/<pk>/save_total_age
如果我向example.com/api/herds/<pk>做一個POST來創建一個Herd,我在這個 "父"Herd被創建后立即呼叫save_total_age() - 而不一定在所有 "子"Herds通過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`,
{},
)
});
我如何設定我的后端信號和/或前端的async/await,以便save_total_age()僅在我的AFTER_CREATE鏈完成后運行?
編輯:我現在最好的解決方案是在save_word_count()中添加一些條件,確保Herd鏈與Animal鏈有相同的物件數量。如果是這樣,運行該方法。如果不是,則回傳一個錯誤的請求并重試POST。
uj5u.com熱心網友回復:
信號(由這些鉤子呼叫)是同步運行的,而不是異步的。所以當你為你的第一個Heard呼叫create()時,它將一直運行AFTER_CREATE鉤子并創建第二個Heard物件,然后再回傳并讓你運行save_total_age()方法。
換句話說,這應該可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332357.html
標籤:
