Ho appena chattato con Google e ho fatto funzionare tutto per la nostra istanza!
Il modo standard per far funzionare utf8mb4 in Django è specificarlo come DATABASES['default']['OPTIONS'] in settings.py, in questo modo:
'OPTIONS': {'charset': 'utf8mb4'},
Ciò provoca un OperationalError in App Engine, su MySQLdb 1.2.4b4 / 1.2.4 / 1.2.5; il che a quanto pare significa che il client MySQL C su cui google sta compilando manca il set di caratteri utf8mb4.
Rimuovi questa impostazione OPZIONI.
La soluzione alternativa consiste nel chiamare manualmente SET NAMES; modifica lib/django/db/backends/mysql/base.py e aggiungi una riga conn.query("SET NAMES utf8mb4") in DatabaseWrapper.get_new_connection, quindi appare così:
def get_new_connection(self, conn_params):
conn = Database.connect(**conn_params)
conn.encoders[SafeText] = conn.encoders[six.text_type]
conn.encoders[SafeBytes] = conn.encoders[bytes]
conn.query("SET NAMES utf8mb4")
return conn
Assicurati di avere abilitato anche utf8mb4 sul back-end. I comandi di migrazione nel tutorial di App Engine Django generano un'istanza Cloud SQL configurata per utf8. Avevo bisogno di eseguire questi comandi per abilitare utf8mb4 sulle due tabelle:
ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4;