如何在South迁移中调用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'
我猜south可能不支持模型类中的@staticmethod
?
直接导入Account会失败,除非我也直接导入Record,并完全忽略ORM对象。这样做是否安全?因为这是数据迁移,模式没有改变。还是说我应该手动运行这个修复,而不是在south迁移的环境中进行?
3 个回答
1
你是不是在用不同的名字 lookup_by_name
和 lookup_name
呢?
7
这里是South文档中相关的部分,解释了为什么你的方法不起作用:
47
你不能在south迁移中使用models.py里的方法。原因是,未来models.py会不断变化,迟早你会删除那些方法,这样迁移就会出问题。
你应该把迁移所需的所有代码放在迁移文件里。