如何知道Django中的数据库何时准备就绪?

如何知道Django中的数据库何时准备就绪?,django,database,postgresql,django-orm,django-signals,Django,Database,Postgresql,Django Orm,Django Signals,只要数据库在Django准备好了,我就需要做一些事情。具体来说,我需要对db中的值执行一些计算,并将结果填充到缓存中 自django 1.7以来,可以很容易地知道何时可以使用一个或多个应用程序模型。你可以写: from django.apps import apps if apps.ready: do_some_stuff() 但我发现,模型准备就绪并不意味着可以查询数据库。Django博士说: 尽管您可以如上所述访问模型类,但请避免 在ready()实现中与数据库交互 我试图连接到

只要数据库在Django准备好了,我就需要做一些事情。具体来说,我需要对db中的值执行一些计算,并将结果填充到缓存中

自django 1.7以来,可以很容易地知道何时可以使用一个或多个应用程序模型。你可以写:

from django.apps import apps

if apps.ready:
    do_some_stuff()
但我发现,模型准备就绪并不意味着可以查询数据库。Django博士说:

尽管您可以如上所述访问模型类,但请避免 在ready()实现中与数据库交互

我试图连接到
post\u migrate
事件。如果我正在重建数据库(例如启动测试套件),它可以工作,但如果我只是使用现有数据库(例如使用
runserver
),它就不能工作


有没有办法知道数据库在Django>=1.7中是否完全可用?

您可以尝试连接信号接收器。

在数据库准备好后,但在访问任何视图/URL之前,
project/\uu init\uuuuuuuuupy.py
中的任何代码都将在启动时运行,因此,只要在
\uuuu init\uuuuu.py
中放入一些代码,它就会按照您的预期运行
post\u migrate
可能是多余的,因为据我所知,在应用程序运行的情况下,您不能运行迁移,如果您确实需要它,只需在启动时和调用信号时运行一个函数。

我也使用post\u migrate信号。(如:)


通过阅读您的问题,我意识到它不适用于“runserver”…

如果我正确理解您正在尝试的操作,那么您希望在启动runserver时使用数据库中的数据填充缓存。因为在生产环境中,runserver不会重新加载,所以在重新启动服务器之前,您只能填充缓存一次(我甚至不确定gunicorn在这方面是否与runserver的行为相同)


那么,在启动之后,您可能有另一种方法使用芹菜或类似的东西来更新缓存?为什么不使用相同的方法执行第一次运行

导入并调用应用程序后,可以在wsgi.py文件中设置代码,如下所示:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

print MyModel.objects.all()[0:5]
# Setup your startup code here since you already have access to your models
我根据这个链接找到了这个答案:

django连接到数据库时,此信号会立即发出,但在它运行所有迁移之前,因此不幸的是,它不会工作。除非我不理解您的答案,否则这完全不是真的。python解释器导入包后,init.py中的代码将立即运行,因此在其他任何情况下都是如此。那么您是否找到了在这两种情况下都有效的解决方案?您是否尝试使用“connection_created”信号?是的,也不起作用,请参阅其他答案和注释。我在上一个答案中还不清楚。如果在进行迁移时使用post_migrate,而在没有创建连接时使用connexion_,这是否可行?要了解您是否有迁移,一个简单但丑陋的方法是测试参数中是否有“迁移”一词。我想正确理解您的用例(特别是为什么runserver很重要)。您正在为迁移后任务和启动后任务填充缓存,并在需要时查找适当的挂钩。这些是繁重的缓存任务(或棘手的原子性),因此您希望确保只执行一次。这是对问题的公平重述吗?好的,它并没有完全回答问题,但您提供的链接引导我找到了正确的方法。谢谢。@ThibaultJ嘿,你是怎么解决这个问题的?我有一个类似的问题issue@SyedAmmarMustafa抱歉,此评论已有四年多历史。我不记得了,我肯定现在有更好的方法来做。