2

我有一些服务器启动代码位于我的一个 Django 应用程序的“models.py”中。我需要在服务器启动时运行该代码。

问题是,该代码发出一个 SQL 查询,这阻止了我运行syncdbpsycopg2它破坏了事务,并且没有创建表。)

将代码放在中间件中并提升django.core.exceptions.MiddlewareNotUsed并不是最佳选择,因为我也希望在 Django shell 中产生效果(并且将初始化代码放在中间件中听起来也不对。)我还需要等待第一个要求这样做。我想在服务器启动时运行代码,而不是在第一个客户来敲我的网站时。

服务器启动信号仍然没有在 Django 中实现,所以这不是一个选项。

因此,我想以某种方式:

  • 检查 Django 是否正在运行同步数据库,所以我不做查询,
  • 或者,或者,检查相应的表是否存在,如果它们不存在,那么也不要进行任何查询

我在任何文档中都没有找到上述两个选项。我怎么做?还是有更好(即理智)的方式来做我想做的事情?

4

4 回答 4

1

Django 也应该urls.py在启动时加载;我无法告诉您这是否适合您的代码,但如果您愿意,请尝试一下!

于 2010-08-30T11:43:33.430 回答
1

你考虑过连接post_syncdb信号吗?也许您可以在收到此信号时运行自定义 SQL。这可能会解决您的部分问题;您仍然需要弄清楚如何在服务器启动时运行 SQL。

于 2010-08-30T11:52:14.550 回答
1

您可以在 settings.py 中进行检查:

import sys
...
IN_SYNCDB = ('syncdb' in sys.argv)

然后

if not settings.IN_SYNCDB:
    # run SQL code
于 2010-08-30T14:01:08.277 回答
0

一些异常处理怎么样?当进行查询但数据库表不存在时,Django.db.utils.DatabaseError会引发 a。Try..except 查询代码是我认为满足您的第二个条件的方式。

问题:models.py

class Foo(Model):
    #model definition here

def fun():
    obj=Foo.objects.get(pk=1)
    #other logics here...

fun() #This causes a DatabaseError

解决方案:models.py

class Foo(Model):
    #model definition here

def fun():
    obj=Foo.objects.get(pk=1)
    #other logics here...

try:
    fun() 
except DatabaseError:
    pass
于 2012-04-22T21:10:17.483 回答