Bien, moví la importación a views.py (o models.py y mientras se importaba solo una vez, se llamaba dos veces.
El problema era que post_save se estaba llamando a la señal cuando el objeto se creó y se guardó. No tengo idea de por qué, así que agregué una solución que ahora funciona
created = False
#Workaround to signal being emitted twice on create and save
if 'created' in kwargs:
if kwargs['created']:
created=True
#If signal is from object creation, return
if created:
return
Editar:
post_save Me llamaron dos veces porque usé .create(...) que es equivalente a __init__(...) y .save() .
Conclusión
dispatch_uid funciona y hacer importaciones individuales sigue siendo una buena práctica.