Hi Greg,
Andrew can correct me if I'm wrong, but I don't believe anything
significant has changed in this particular respect from South to Django
migrations. South serialized a dotted-path reference to custom field
classes in its frozen dict, whereas Django imports them in the migration
file, but the effect is identical; when the migration is run, the custom
field class is imported and used in the reconstructed model. In both
South and Django migrations, changing the import location of a custom
field will break past migrations (unless you fix them - and fixing them
is more obvious and straightforward in Django migrations) and changing
the behavior of a custom field class could change the behavior of a past
migration.
I don't believe that either South or Django has a feasible alternative,
since serializing/freezing arbitrary Python code is not workable.
When you say "the South docs were always quite firm about not doing this
sort of thing", you may be thinking of importing models directly into
your migration file. This is equally discouraged in both. Unlike custom
field classes, South and Django migrations do freeze (or actually
reconstruct, in the case of Django migrations) the structure of your
models (but not arbitrary methods; Python code again) at the time of the
migration, so if you import a model directly rather than using the
frozen version, it may not match your database tables.
Carl