同一文件中的Python和Django模型没有看到对方

时间:2014-02-28 13:53:43

标签: python django

class B(models.Model):
    whatever = models.TextField(blank=True)

    @staticmethod
    def are_we_ok():
        return False

class A(models.Model)
    text = models.TextField(blank=True)

    @staticmethod
    def is_everything_ok():
        if not B.are_we_ok():
            raise B.DoesNotExist




A.is_everything_ok()

为什么我收到错误:

File "asdf/models.py", line x, in is_everything_ok
    if not B.are_we_ok():

AttributeError: 'NoneType' object has no attribute 'are_we_ok'

但是,如果我这样做:

class A(models.Model)
    text = models.TextField(blank=True)

    @staticmethod
    def is_everything_ok():
        from asdf.models import B
        if not B.are_we_ok():
            raise B.DoesNotExist

它有效。这对我没有任何意义。这是巨大的 Django应用程序的一部分。任何想法可能会导致什么样的情况? (例如,循环依赖可能吗?)

更新

我忘了提到这段代码已经运行了四年没有任何麻烦。最近一些无关的编辑引发了此错误。

2 个答案:

答案 0 :(得分:1)

@staticmethod替换为@classmethod。使用staticmethod时,self或类都不会作为第一个参数传递,这就是您无法调用该方法的原因。

如果切换,则需要将该类添加为函数的第一个参数:

class B(models.Model):
    whatever = models.TextField(blank=True)

    @classmethod
    def are_we_ok(cls):
        return False

有关详细信息,请参阅:What is the difference between @staticmethod and @classmethod in Python?

答案 1 :(得分:0)

原因是循环导入。我重构了模型包而不是大量的models.py文件,并且能够摆脱这种情况。

我想知道为什么Django / Python允许这种"灵活性"。我知道Python不是Java,但这不会发生在Java上。