Как вызвать статические методы в классе модели django во время южной миграции

Я пишу миграцию данных на юг, чтобы исправить некоторые денормализованные данные, которые я испортил в более раннем коде. Способ определения правильного значения для неправильного поля – вызов статического метода в классе модели django. Код выглядит так:

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() 

Но это не с

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

Я предполагаю, что юг просто не поддерживает @staticmethod s на классах моделей?

Попытка импортировать учетную запись напрямую не удалась, если я также не импортирую запись напрямую и полностью игнорирую объект ORM. Это безопасный вариант, так как это миграция данных, и схема не меняется? Или я должен просто запустить это исправление вручную, а не в контексте южной миграции.

Вы не можете использовать методы из models.py в южных миграциях. Причина в том, что в будущем models.py будет развиваться, и рано или поздно вы удалите эти методы, тогда миграция будет нарушена.

Вы должны поместить весь код, необходимый для миграции, в файл миграции.

Вот соответствующий раздел южных документов, объясняющий, почему ваши методы не работают:

Обоснование сериализации

Разве вы не используете разные имена lookup_by_name и lookup_name ?