Absinthe/Ecto changeset with atom enums

I think your problem can be solved by using Absinthe.Middleware.MapGet.

In your schema.ex, define a new apply function which transforms :gender atoms to strings. I assume you have a middleware function like this:

  def middleware(middleware, field, object) do
    middleware
    # |> ...your own apply functions
    |> apply(:get_string, field, object)
  end

  defp apply(middleware, :get_string, field, %{identifier: :gender} = object) do
    new_middleware = {Absinthe.Middleware.MapGet, to_string(field.identifier)}

    middleware
    |> Absinthe.Schema.replace_default(new_middleware, field, object)
  end

I stole this technique almost verbatim from Craft GraphQL APIs in Elixir with Absinthe (Pragprog)