从api同步数据到wagtail



我想创建和更新wagtail页面,使/api/端点与wagtail页面同步。

我做了一个例子如何创建,它的工作。但是随着更新,我必须改变一些逻辑。我试图添加一个不同的主键,并使用它来保存idAPI,但我得到了一个错误:

试图添加一个已经存在于数据库中的树节点

def get_some_data():
products = some_api_endpoint()
product_page_content_type = ContentType.objects.get_for_model(Product)
language_en = Language.objects.get(code="en")
home_page_en = HomePage.objects.get(language=1)
product_index_page_en = ProductsPage.objects.descendant_of(
home_page_en
).first()
for level_1 in products:
for level_2 in level_1["general"]:
# product_en, _ = Product.objects.update_or_create(
#     id=level_2["id"],
# )
# product_en.language = level_2["id"]
# product_en.title = level_2["name"]
# product_en.draft_title = level_2["name"]
# product_en.code = level_2["id"]
# product_en.content_type=product_page_content_type,
product_en = Product(
# id=level_2["id"], # won't work, must be incremental
language=language_en,
title=level_2["name"],
draft_title=level_2["name"],
code=level_2["id"],
content_type=product_page_content_type,
)
product_index_page_en.add_child(instance=product_en)
product_en.save()

我们的项目使用api在站点之间移动数据。我们的一般方法是将API中的主键保存在Page模型的字段中。因此,在您的示例中,这将是您的产品页面模型中的source_id。然后在循环中,首先检查是否有包含source_id == level_2.id的Product页面。如果找到一条记录,更新Product中的字段并执行正常的product_en.save()。如果您没有找到记录,那么使用您创建记录的代码add_child,并保存。

最新更新