python django django-south

python - Cómo llamar a métodos estáticos en una clase de modelo de django durante una migración al sur



django-south (3)

Estoy escribiendo una migración de datos en el sur para arreglar algunos datos desnormalizados que cometí en un código anterior. La forma de averiguar el valor correcto para el campo incorrecto es llamar a un método estático en la clase de modelo django. El código se ve así:

class Account(models.Model): name = models.CharField() @staticmethod def lookup_by_name(name): # There''s actually more to it than this return Account.objects.get(name=name) class Record(models.Model): account_name = models.CharField() acct = models.ForeignKey(''Account'')

...

class Migration(DataMigration): def forwards(self, orm): # Fixing Records with the wrong FK to Account for record in orm.Record.objects.all(): record.acct = orm.Account.lookup_by_name(record.account_name) record.save()

Pero esto falla con

AttributeError: type object ''Account'' has no attribute ''lookup_by_name''

¿Supongo que el sur simplemente no soporta @staticmethod s en clases modelo?

El intento de importar la cuenta falla directamente, a menos que también importe el registro directamente y ignoro completamente el objeto ORM. ¿Es una opción segura, ya que es una migración de datos y el esquema no está cambiando? O debería simplemente ejecutar esta revisión a mano en lugar de en el contexto de una migración al sur.


¿No estás usando diferentes nombres lookup_by_name y lookup_name ?



No puedes usar métodos de models.py en las migraciones del sur. La razón es que en el futuro los modelos.py evolucionarán y, tarde o temprano, eliminará esos métodos y la migración se interrumpirá.

Debe colocar todo el código necesario para la migración en el propio archivo de migración.