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

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как создать абстрактную мутацию GraphQL в Wagtail (Django) с помощью Graphene

Сообщение Anonymous »

Пытаюсь сделать мутацию для создания страницы в Wagtail с помощью графена-django.
Тип создаваемой страницы должен зависеть от переданных параметров.
Все страницы, которые должны быть созданы, используют один и тот же ввод, а именно:

Код: Выделить всё

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)
Первый подкласс, который я хочу реализовать, — это 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 (не наследуемый от родительского класса), создание страницы прошло гладко.

Подробнее здесь: https://stackoverflow.com/questions/791 ... h-graphene
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»