当前位置: 首页 > 面试题库 >

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

郜彦
2023-03-14
问题内容

我正在南部进行数据迁移,以修复我在早期代码中搞砸的一些非规范化数据。找出错误字段的正确值的方法是在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对象。这是一个安全的选择,因为它是数据迁移并且架构没有更改?还是我应该手动运行此修复程序,而不是在向南迁移的情况下。


问题答案:

在向南迁移中,不能使用来自models.py的方法。原因是在将来,models.py将会发展,您迟早会删除这些方法,然后迁移就会中断。

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



 类似资料:
  • 问题内容: 说,我有一个带有SomeType的具有静态方法的Class对象的引用。有没有一种方法可以调用该方法而不先实例化SomeType?最好不要转义强类型。 编辑:好的,我搞砸了。 在这种情况下,someMethod()始终不能是静态的。 问题答案: 根据定义,静态方法是在类上调用的,而不是在该类的实例上调用的。 因此,如果您使用: 您没有实例化任何东西(不考虑由JVM处理并且超出了您的范围的

  • 问题内容: 我有一个包含静态创建方法的类。 当我使用时,它可以被编译。但是当我使用时,它编译失败,如何指定泛型? 问题答案: 假设您询问有关在类型推断失败的情况下显式指定类型的信息,则可以使用(请注意,该类型在after之后而不是before之前)。

  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 问题内容: 因此,大约一年前,我开始了一个项目,像所有新开发人员一样,我并没有真正专注于结构,但是现在与Django一起,我开始觉得我的项目布局主要是我的模型在结构上很糟糕。 我的模型主要保存在单个应用程序中,实际上这些模型中的大多数应该放在自己的单个应用程序中,我确实尝试解决了此问题并将其向南移动,但是由于外键等原因,我发现它很棘手,而且确实很困难。 但是由于Django 1.7并内置了对迁移的

  • 问题内容: 我遇到了一个涉及静态泛型方法的奇怪情况。这是代码: 我为什么不必在表达式中指定任何类型参数?这是某种类型推断吗?如果我想对此进行明确说明,如何指定类型参数? 问题答案: 是的,根据JLS第15.12.2.8节,这是基于分配目标的类型推断。明确地说,您可以这样称呼:

  • 问题内容: 我目前正在尝试向我的猫鼬模式中添加静态方法,但是我找不到它无法通过这种方式工作的原因。 我的模特: IUser: 如果我现在尝试拨打电话,则会出现以下错误 我知道我没有在任何地方定义方法,但我真的不知道在哪里可以放置它,因为我不能只是将静态方法放到接口中。希望您能帮助我找到错误,在此先感谢! 问题答案: 我认为您遇到了我刚刚遇到的同样问题。您可以拨打此电话。几个教程让您从这样的模型中调

  • 错误:org.mockito.exceptions.misusing.missingMethodInvocationException:when()需要一个参数,该参数必须是“mock上的方法调用”。例如:when(mock.getArticles()).thenreturn(articles); 此外,此错误可能会出现,因为:1。您可以存根:finall/private/equals()/has

  • 问题内容: 我是JSP的新手。我尝试连接MySQL和我的JSP页面,并且工作正常。但是这是我需要做的。我有一个名为“ balance”的表格属性。检索它并使用它来计算一个称为“金额”的新值。(我不是在打印“余额”)。 似乎不可能在JSTL标签中插入scriptlet。 问题答案: 你不能直接在EL中调用静态方法。EL将仅调用实例方法。 对于失败的scriptlet尝试,你不能混合scriptlet