如何在南迁移期间调用django模型类上的静态方法

时间:2010-07-22 22:56:18

标签: python django django-south

我正在南方编写数据迁移来修复我在早期代码中搞砸的一些非规范化数据。找出错误字段的正确值的方法是在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

尝试直接导入帐户失败,除非我还直接导入Record并完全忽略ORM对象。这是一个安全的选择,因为它是一个数据迁移,架构没有改变?或者我应该手动运行此修复,而不是在南迁移的情况下。

3 个答案:

答案 0 :(得分:38)

您无法在南迁移中使用models.py中的方法。原因是未来models.py将会发展,迟早会删除这些方法,然后迁移将被破坏。

您应该将迁移所需的所有代码放在迁移文件本身中。

答案 1 :(得分:7)

以下是南方文档的相关部分,解释了为什么您的方法不起作用:

Rationale behind the serialisation

答案 2 :(得分:1)

您是不是使用了不同的名称lookup_by_namelookup_name