Как вызвать статические методы в классе модели django во время миграции на юг - PullRequest
23 голосов
/ 23 июля 2010

Я пишу миграцию данных на юг, чтобы исправить некоторые денормализованные данные, которые я испортил в предыдущем коде. Чтобы определить правильное значение для неправильного поля, нужно вызвать статический метод в классе модели 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. Это безопасный вариант, так как это миграция данных и схема не меняется? Или я должен просто запустить это исправление вручную, а не в контексте миграции на юг.

Ответы [ 3 ]

38 голосов
/ 23 июля 2010

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

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

7 голосов
/ 27 июля 2010

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

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

1 голос
/ 23 июля 2010

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

...