Как создать абстрактную мутацию GraphQL в Wagtail (Django) с помощью Graphene

Я пытаюсь сделать мутацию для создания страницы в Wagtail с помощью graphene-django. Тип создаваемой страницы должен зависеть от переданных параметров.

Все страницы, которые должны быть созданы, используют один и тот же вход, а именно:

class PageInput(InputObjectType):
    parent_id = Int(required=True)
    page_id = Int(required=True)
    page_name = String(required=True)

, где page_id - это id из другого приложения, а page_name - это имя записи из другого приложения - оба передаются в Mutation как параметры.

Поскольку все страницы имеют одинаковый вход, они должны иметь общий метод mutate(). Для каждого типа существует свой метод prepare_pages(), специфичный для данного типа.

Я хочу получить абстрактный мутационный класс CreatePage, который определяет метод mutate() и несколько классов, которые наследуют этот класс и реализуют свой собственный метод prepare_pages().

Я реализовал абстрактный класс таким образом:

class CreatePages(Mutation):
    class Meta:
        abstract = True

    class Arguments:
        pages = List(PageInput)

    page_ids = List(Int)
    creation_times = List(String)

    def prepare_pages(pages):
        raise NotImplementedError("Subclasses must implement this method.")

    @classmethod
    def mutate(cls, root, info, pages):
        page_ids = []
        creation_times = []

        pages_to_create = cls.prepare_pages(pages)

        for page in pages_to_create:
            try:
                page.save_revision().publish()

                page_ids.append(page.page_id)
                creation_times.append(page.latest_revision_created_at
                                      .strftime('%Y-%m-%d %H:%M:%S'))
            except Exception:
                continue

        return cls(page_ids=page_ids, creation_times=creation_times)

Первым подклассом, который я хочу реализовать, является CreateProductPage:

class CreateProductPages(CreatePages):

    def prepare_pages(products):
        pages = []
        for product in products:
            try:
                page = ProductPage()
                parent_page = Page.objects.get(id=product.parent_id)

                page.product_id = product.page_id
                page.name = product.page_name if product.page_name else page.product_id
                page.title = page.name
                parent_page.add_child(instance=page)

                pages.append(page)
            except Exception:
                raise
        return pages

При вызове мутации я постоянно получаю следующую ошибку GraphQL из строки parent_page.add_child(instance=page):

{
  "errors": [
    {
      "message": "'NoneType' object has no attribute '_inc_path'",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createProductPages"
      ]
    }
  ],
  "data": {
    "createProductPages": null
  }
}

Как я могу решить эту проблему? Хочу добавить, что пока у меня был только один класс Mutation (не наследующий от родительского класса), создание страницы проходило без проблем.

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