Home > OS >  How to inherit Input inner class in Python graphene mutation to another Input inner class in another
How to inherit Input inner class in Python graphene mutation to another Input inner class in another

Time:05-30

I am creating a simple GraphQL request app in the backend using Django with graphene-django package. Waht I need is to inherit the Input inner class in the create mutation to the Input class for the update mutation. Can I do this using any way, and if not can any one help me solving this kind of issue, and to know that I know how to solve it but I don't want to rewrite the same field in the create and in the update mutations for the same model or type.

This is a sample of my code:

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)


But this code gives me this error:

TypeError at /graphql
Cannot create a consistent method resolution
order (MRO) for bases InputObjectType, Input

CodePudding user response:

I have created this code to solve my problem until anyone helps me with the issue.

The code looks like this:

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)

CodePudding user response:

Something like that works in my project:

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)
  • Related