如何在南迁移期间调用 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'

我猜南只是不支持模型类上的@staticmethods?

尝试直接导入 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_namelookup_name吗?

【讨论】:

感谢您在我的问题中发现错字。这不是我的真实代码的问题。 我提交了一个小的更改请求来修复原始问题中的这个错字。我正在浏览这个问题,因为我遇到了类似的问题并且被简单的答案分散了注意力。

以上是关于如何在南迁移期间调用 django 模型类的静态方法的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型外键字段在测试期间的迁移中不可用

如何在托管 = False 的 Django 测试期间创建表?

在测试期间更改 Django 迁移应用程序的顺序

迁移期间的 Django 问题 - 懒惰的参考

如何在Django中基于枚举为模型字段设置默认值?

Django迁移RunPython无法调用模型方法