如何*不*在syncdb上运行Django代码

时间:2010-08-30 11:38:45

标签: django django-signals django-syncdb

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

问题是,该代码发出SQL查询,这阻止我使用syncdb运行psycopg2(它会中断事务,并且不会创建表。)

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

Django中仍未实现服务器启动信号,因此这不是一个选项。

因此,我想以某种方式:

  • 检查Django是否正在运行syncdb,所以我不进行查询,
  • 或者,检查相应的表是否存在,如果不存在,那么,也就是不要进行任何查询

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以勾选settings.py:

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

然后

if not settings.IN_SYNCDB:
    # run SQL code

答案 3 :(得分:0)

如何进行一些异常处理?在执行查询但数据库表不存在时,会引发Django.db.utils.DatabaseError。尝试..除了查询代码是我认为符合您的第二个标准的方式。

问题: 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