Lo que estás viendo es el comportamiento correcto.
get_or_create es la abreviatura de 'obtener y devolver el objeto que coincide con kwargs , si no existe, créelo usando defaults '. Su búsqueda está buscando un objeto donde name es una coincidencia que no distingue entre mayúsculas y minúsculas con 'cedar' . Ese objeto existe, por lo que se devuelve. Nada más, nada menos.
Ahora bien, si no hubiera ninguna coincidencia, Stéphane tiene razón y tendrías que especificar name en los defaults parámetro. Todas las búsquedas que contienen el separador de búsqueda __ se eliminan de los parámetros pasados a create() .