如何在South迁移中调用Django模型类的静态方法

30 投票
3 回答
16453 浏览
提问于 2025-04-16 01:43

我正在用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'

我猜south可能不支持模型类中的@staticmethod

直接导入Account会失败,除非我也直接导入Record,并完全忽略ORM对象。这样做是否安全?因为这是数据迁移,模式没有改变。还是说我应该手动运行这个修复,而不是在south迁移的环境中进行?

3 个回答

1

你是不是在用不同的名字 lookup_by_namelookup_name 呢?

7

这里是South文档中相关的部分,解释了为什么你的方法不起作用:

序列化背后的原因

47

你不能在south迁移中使用models.py里的方法。原因是,未来models.py会不断变化,迟早你会删除那些方法,这样迁移就会出问题。

你应该把迁移所需的所有代码放在迁移文件里。

撰写回答