如何在南迁移期间调用 django 模型类的静态方法
Posted
技术标签:
【中文标题】如何在南迁移期间调用 django 模型类的静态方法【英文标题】:How to call a static methods on a django model class during a south migration 【发布时间】:2011-03-19 20:31:30 【问题描述】:我正在南方编写数据迁移,以修复我在早期代码中搞砸的一些非规范化数据。找出错误字段的正确值的方法是在 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?
尝试直接导入 Account 失败,除非我也直接导入 Record 并完全忽略 ORM 对象。这是一个安全的选择,因为它是数据迁移并且架构没有改变?或者我应该手动运行此修复程序,而不是在南迁的情况下运行此修复程序。
【问题讨论】:
【参考方案1】:这是 South 文档的相关部分,解释了为什么您的方法不起作用:
Rationale behind the serialisation
【讨论】:
链接失效,这里是最新的缓存版本:web.archive.org/web/20120502060506/https://south.aeracode.org/…【参考方案2】:您不能在南迁移中使用 models.py 中的方法。原因是将来models.py会发展,迟早你会删除那些方法,然后迁移就会被破坏。
您应该将迁移所需的所有代码放在迁移文件本身中。
【讨论】:
thx,这听起来是一个很好的理由,但有时不允许使用它真的很痛苦。也许应该有一些可以改变行为的设置,如果他/她打开它,开发人员负责在以后的代码版本中保留方法。【参考方案3】:你不是用不同的名字lookup_by_name
和lookup_name
吗?
【讨论】:
感谢您在我的问题中发现错字。这不是我的真实代码的问题。 我提交了一个小的更改请求来修复原始问题中的这个错字。我正在浏览这个问题,因为我遇到了类似的问题并且被简单的答案分散了注意力。以上是关于如何在南迁移期间调用 django 模型类的静态方法的主要内容,如果未能解决你的问题,请参考以下文章