Как создать абстрактную мутацию 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 (не наследующий от родительского класса), создание страницы проходило без проблем.