# ... class CategoryInput(graphene.InputObjectType): id = graphene.ID() name = graphene.String() class TechnologyInput(graphene.InputObjectType): id = graphene.ID() name = graphene.String() class ProjectInput(graphene.InputObjectType): title = graphene.String() text = graphene.String() category = graphene.Field(CategoryInput) technologies = graphene.List(TechnologyInput) class CreateProject(graphene.Mutation): class Arguments: project_data = ProjectInput() id = graphene.Int() created_date = graphene.DateTime() owner = graphene.Field(UserType) project = graphene.Field(ProjectType) def mutate(self, info, project_data): user = info.context.user if user.is_anonymous: raise Exception('You must be logged in to make projects!') category = Category.objects.filter(id=project_data.category.id).first() if not category: raise Exception('Invalid category ID!') technologies = [] for technologies_data in project_data.technologies: technology = Technology.objects.get(id=technologies_data.id) if technology is None: raise Exception('Invalid technology ID!') technologies.append(technology) project_instance = Project(owner_id=user.id, title=project_data.title, text=project_data.text, category=category) project_instance.save() project_instance.technologies.set(technologies) return CreateProject