Синхронизация данных из api в wagtail

Я хотел бы узнать, есть ли пример того, как создать или обновить страницу wagtail? Я хотел бы синхронизировать данные из конечной точки /api/ со страницей wagtail. Я сделал пример создания, и он работает, но при обновлении мне нужно изменить некоторую логику. Я попытался добавить другой первичный ключ и использовать его для сохранения id из api, но получил ошибку: Attempted to add a tree node that is already in the database

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()

class Command(BaseCommand): def handle(self, *args, **options): get_some_data()

Наш проект использует API для перемещения данных между сайтами. Наш общий подход заключается в сохранении первичного ключа из API в поле в модели страницы. В вашем примере это будет что-то вроде source_id в модели страницы Product. Затем в цикле сначала проверьте, есть ли у вас страница продукта с source_id == level_2.id. Если вы нашли запись, обновите поля в Product и сделайте обычный product_en.save(). Если запись не найдена, то используйте имеющийся код для создания записи, add_child и сохраните.

Вернуться на верх