Тип создаваемой страницы должен зависеть от переданных параметров.
Все страницы, которые должны быть созданы, используют один и тот же ввод, а именно:
Код: Выделить всё
class PageInput(InputObjectType):
parent_id = Int(required=True)
page_id = Int(required=True)
page_name = String(required=True)
где page_id — это идентификатор из другого приложения, а page_name — это имя записи из другого приложения — оба переданы к Mutation в качестве параметров.
Поскольку все страницы имеют одинаковые входные данные, предполагается, что у них должен быть общий метод mutate(). Что отличается для каждого типа, так это специфичный для типа метод подготовить_страницы().
Я хочу добиться абстрактного класса мутации CreatePage, который будет определять мутацию () и несколько классов, которые наследуют его и реализуют собственный метод подготовить_страницы().
Я реализовал абстрактный класс следующим образом:
Код: Выделить всё
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)
Код: Выделить всё
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
Код: Выделить всё
{
"errors": [
{
"message": "'NoneType' object has no attribute '_inc_path'",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"createProductPages"
]
}
],
"data": {
"createProductPages": null
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... h-graphene