Python和Django模型在同一文件中无法相互看到

2024-04-20 16:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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应用程序的一部分。你知道什么情况会导致这种情况吗?(例如,循环依赖是否可能?)你知道吗

更新:

我忘了提到的是,这段代码已经在生产中运行了四年,没有任何问题。只是最近一些不相关的编辑触发了这个错误。你知道吗


Tags: truemodelifismodelsdefnotok
2条回答

@classmethod替换@staticmethod。对于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?。你知道吗

原因是循环导入。我将模型重构为模型包,而不是大规模的型号.py文件,并能摆脱这个。你知道吗

我想知道为什么Django/Python允许这种“灵活性”。我知道Python不是Java,但是Java不会这样。你知道吗

相关问题 更多 >