Python 为什么执行Django查询会导致:Django.core.exceptions.AppRegistryNotReady:模型不';还没上膛吗?
我正在从事Django 1.8.2项目 此项目有多个Django应用程序 应用程序Python 为什么执行Django查询会导致:Django.core.exceptions.AppRegistryNotReady:模型不';还没上膛吗?,python,django,Python,Django,我正在从事Django 1.8.2项目 此项目有多个Django应用程序 应用程序app_a的类MyClassA如下: class MyClassA(models.Model): name = models.CharField(max_length=50, null=True, blank=True) @staticmethod def my_static_method(): ret_val = MyClassA.objects.filter()
app_a
的类MyClassA
如下:
class MyClassA(models.Model):
name = models.CharField(max_length=50, null=True, blank=True)
@staticmethod
def my_static_method():
ret_val = MyClassA.objects.filter()
return "World"
class MyClassB(models.Model):
name = models.CharField(max_length=50, null=False, blank=False)
def my_method(self, arg1=MyClassA.my_static_method()):
return "Hello"
应用程序app_b
的类MyClassB
如下:
class MyClassA(models.Model):
name = models.CharField(max_length=50, null=True, blank=True)
@staticmethod
def my_static_method():
ret_val = MyClassA.objects.filter()
return "World"
class MyClassB(models.Model):
name = models.CharField(max_length=50, null=False, blank=False)
def my_method(self, arg1=MyClassA.my_static_method()):
return "Hello"
当我运行manage.py测试时,它工作正常
但是,我将MyClassA.my_static_method()
更改为以下内容:
@staticmethod
def my_static_method():
ret_val = MyClassA.objects.filter(name=None)
return "World"
当我这样做,然后运行manage.py test
时,它失败并出现以下错误:
File "my-virtual-env/lib/python2.7/site-packages/django/apps/registry.py", line 131, in check_models_ready
raise AppRegistryNotReady("Models aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
为什么会这样?我该如何解决这个问题
我所做的唯一更改是添加筛选值name=None
。在这种情况下,只有在管理器函数中出错时,才会出现错误。我也试过同样的方法,它对我有效。但是,当我在filter()中出错时,我得到了相同的错误。比如MyClassA.objects.filter(在\u模型中的\u字段\u not \u=None)
我想你必须重新检查你的原始代码。检查您的模型是否正常。在Django中,您不能在导入时运行查询。(有关详细信息,请参阅。)
由于Python中的默认参数值是在定义函数时计算的(与调用函数时相反),因此您的MyClassB.my_method()
定义正在调用MyClassA.my_static_method()
,它尝试运行查询
为什么您在一个版本的代码中看到错误而在另一个版本中没有看到?其中一个正在评估查询(即尝试访问数据库),而另一个没有,无论出于何种原因。您有责任确保在导入时所做的任何操作都不会试图访问数据库
如果您的目标是在每次调用时对该默认参数求值,那么Python中的标准习惯用法是:
def my_method(self, arg1=None):
if arg1 is None:
arg1 = MyClassA.my_static_method()
1.您是否在已安装的应用程序中的应用程序b
之前有应用程序a
?2.我认为,在添加name=None
过滤器时出现异常的原因可能与此有关:。也就是说,我认为当您只调用filter()
时,可能您的查询甚至没有被计算,因此它隐藏了您的问题。如果将print(ret_val)
添加到空的filter()
示例中,您可能会看到同样的情况。1。对2.使用空过滤器添加print ret_val
,不会导致错误。值得注意的是,这不是运行时错误。这是一个编译时错误,因为从未调用MyClassB.my_method()
。