Как назвать статические методы для 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'

Я предполагаю, что юг просто не поддерживает @staticmethods на образцовых классах?

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

23
задан Nick Ruiz 9 March 2011 в 09:52
поделиться

3 ответа

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

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

38
ответ дан 29 November 2019 в 01:45
поделиться

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

1
ответ дан 29 November 2019 в 01:45
поделиться

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

Rationale behind the serialisation

7
ответ дан 29 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: