我需要在Django中准备好数据库后立即执行操作。具体来说,我需要对db中的值执行一些计算,并将结果填充到缓存中。
从django 1.7开始,application registry可以让您轻松了解一个或多个应用程序何时可以使用。你可以写:
from django.apps import apps
if apps.ready:
do_some_stuff()
但我发现模型准备就绪并不意味着可以查询数据库。 Django doc说:
虽然您可以如上所述访问模型类,但请避免使用 在ready()实现中与数据库进行交互
我试图联系post_migrate
事件。如果我重建数据库(例如启动测试套件),它就可以工作,但如果我只使用现有的数据库(例如使用runserver
)则不行。
有没有办法知道数据库是否在Django> = 1.7?
中完全可用答案 0 :(得分:2)
我还使用了post_migrate信号。 (as:https://github.com/mrjmad/django_badgificator/blob/master/badgificator/apps.py)。
我通过阅读您的问题意识到它与“运行服务器”无关。 ...
答案 1 :(得分:1)
您可以尝试连接connection_created信号的接收器。
答案 2 :(得分:0)
如果我正确理解您要执行的操作,则需要在启动runserver时使用DB中的数据填充缓存。由于在生产中,runserver不会重新加载,因此只会重新启动缓存一次,直到重新启动服务器为止(我甚至不确定gunicorn的行为方式与runserver相同)。
所以你可能有另一种方法在启动后使用芹菜或类似的东西来更新你的缓存?为什么不以同样的方式执行第一次运行?
答案 3 :(得分:0)
您可以在导入并调用应用程序后在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
我基于以下链接找到了这个答案: Entry point hook for Django projects
答案 4 :(得分:-2)
project/__init__.py
中的任何代码都将在数据库准备好之后但在访问任何视图/网址之前在启动时运行,因此只需在__init__.py
中放入一些代码,它就会按预期运行。 post_migrate
可能是多余的,因为据我所知,您无法在应用运行时运行迁移,如果您绝对需要它,只需要在启动时和信号时运行的功能被称为。