As I thought, the error had absolutely nothing to do with Zinnia. It was a syntax error being exposed in my own code in a completely random place. I was using an exception without a try in there. Rookie error:
except User.DoesNotExist:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Lesson learnt: Don't rely on the Django errors in the browser. If they're confusing, check the actual apache error logs! Because no doubt you'll see something like this:
File "../project/users/api/views.py", line 76
except User.DoesNotExist:
^
It's working now at least!