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
?
Aquí está la sección pertinente de los documentos del Sur que explica por qué sus métodos no funcionan:
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.