Как наследовать внутренний класс Input в графеновой мутации Python другому внутреннему классу Input в другой мутации?
Я создаю простое приложение для работы с GraphQL запросами в бэкенде, используя Django с пакетом graphene-django.
Мне нужно наследовать внутренний класс Input
в мутации создания в класс Input
для мутации обновления.
Могу ли я сделать это каким-либо способом, и если нет, может ли кто-нибудь помочь мне решить подобную проблему, и чтобы знать, что я знаю, как ее решить, но я не хочу переписывать одно и то же поле в мутациях create и update для одной и той же модели или типа
Вот пример моего кода:
import graphene
from graphene import relay
from BoD.models import Meeting
from BoD.types.meeting import MeetingType
class CreateMeeting(relay.ClientIDMutation):
"""Mutation to create a new meeting."""
class Input:
created_by_id = graphene.Int(required=True)
subject = graphene.String(required=True)
location = graphene.String(required=True)
date = graphene.DateTime(required=True, datetime_input=graphene.DateTime(required=True))
start_time = graphene.Time(required=True)
end_time = graphene.Time(required=True)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Create a new meeting."""
meeting = Meeting.objects.create(**input)
return CreateMeeting(meeting=meeting)
class UpdateMeeting(CreateMeeting):
"""Mutation to update a meeting."""
class Input(CreateMeeting.Input):
id = graphene.Int(required=True)
class MeetingMutate:
class Meta:
abstract = True
created_by_id = graphene.Int(required=True)
subject = graphene.String(required=True)
location = graphene.String(required=True)
date = graphene.DateTime(required=True, datetime_input=graphene.DateTime(required=True))
start_time = graphene.Time(required=True)
end_time = graphene.Time(required=True)
class CreateMeeting(relay.ClientIDMutation):
"""Mutation to create a new meeting."""
class Input(MeetingMutate.Meta):
pass
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Create a new meeting."""
meeting = Meeting.objects.create(**input)
return CreateMeeting(meeting=meeting)
class UpdateMeeting(CreateMeeting):
"""Mutation to update a meeting."""
class Input(MeetingMutate.Meta):
id = graphene.Int(required=True)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Update a meeting."""
meeting = Meeting.objects.get(pk=input['id'])
meeting.update(**input)
meeting.save()
return UpdateMeeting(meeting=meeting)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Update a meeting."""
meeting = Meeting.objects.get(pk=input['id'])
meeting.update(**input)
meeting.save()
return UpdateMeeting(meeting=meeting)
Но этот код дает мне такую ошибку:
TypeError at /graphql
Cannot create a consistent method resolution
order (MRO) for bases InputObjectType, Input
Я создал этот код для решения моей проблемы, пока никто не поможет мне с этим вопросом.
Код выглядит следующим образом:
import graphene
from graphene import relay
from BoD.models import Meeting
from BoD.types.meeting import MeetingType
class MeetingInput(graphene.InputObjectType):
created_by_id = graphene.Int(required=True)
subject = graphene.String(required=True)
location = graphene.String(required=True)
date = graphene.DateTime(required=True)
start_time = graphene.Time(required=True)
end_time = graphene.Time(required=True)
class CreateMeeting(relay.ClientIDMutation):
"""Mutation to create a new meeting."""
class Input:
input = MeetingInput(required=True)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, input):
"""Create a new meeting."""
meeting = Meeting.objects.create(**input)
return CreateMeeting(meeting=meeting)
class UpdateMeeting(relay.ClientIDMutation):
"""Mutation to update a meeting."""
class Input:
input = MeetingInput(required=True)
id = graphene.Int(required=True)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, input):
"""Update a meeting."""
meeting = Meeting.objects.get(id=input.id)
meeting.update(**input)
meeting.save()
return UpdateMeeting(meeting=meeting)
Нечто подобное работает в моем проекте:
class MeetingInput:
created_by_id = graphene.Int(required=True)
subject = graphene.String(required=True)
location = graphene.String(required=True)
date = graphene.DateTime(required=True)
start_time = graphene.Time(required=True)
end_time = graphene.Time(required=True)
class CreateMeeting(relay.ClientIDMutation):
"""Mutation to create a new meeting."""
class Input(MeetingInput):
pass
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Create a new meeting."""
meeting = Meeting.objects.create(**input)
return CreateMeeting(meeting=meeting)
class UpdateMeeting(relay.ClientIDMutation):
"""Mutation to update a meeting."""
class Input(MeetingInput):
id = graphene.Int(required=True)
meeting = graphene.Field(MeetingType)
@classmethod
def mutate_and_get_payload(cls, root, info, **input):
"""Update a meeting."""
meeting = Meeting.objects.get(id=input.pop('id'))
meeting.update(**input)
meeting.save()
return UpdateMeeting(meeting=meeting)