Как * не * запускать код Django на syncdb - PullRequest
2 голосов
/ 30 августа 2010

У меня есть некоторый код запуска сервера, который лежит в "models.py" одного из моих приложений Django. Мне нужно запустить этот код во время запуска сервера.

Проблема в том, что код выдает SQL-запрос, который не позволяет мне запустить syncdb с psycopg2 (это прерывает транзакцию и таблицы не создаются.)

Помещать код в промежуточное ПО и поднимать django.core.exceptions.MiddlewareNotUsed не оптимально, так как я хотел бы получить эффект и в оболочке Django (а помещение кода инициализации в промежуточное ПО в любом случае не звучит правильно). Также я ' Мне нужно дождаться первого запроса, чтобы сделать это. Я хочу запускать код при запуске сервера, а не тогда, когда первый клиент стучится в мой сайт.

Сигналы запуска сервера до сих пор не реализованы в Django, так что это не вариант.

Таким образом, я бы хотел как-нибудь:

  • проверить, работает ли Django syncdb, поэтому я не выполняю запросы,
  • или, альтернативно, проверьте наличие соответствующих таблиц, а если их нет, то тоже просто не выполняйте никаких запросов

Ни один из вышеперечисленных вариантов я не нашел ни в одной документации. Как я могу это сделать? Или есть лучший (то есть вменяемый) способ делать то, что я хочу делать?

Ответы [ 4 ]

1 голос
/ 30 августа 2010

Рассматривали ли вы возможность подключения к сигналу post_syncdb?Возможно, вы можете запустить пользовательский SQL при получении этого сигнала.Это может решить часть вашей проблемы;Вы все еще должны выяснить, как запустить SQL при запуске сервера.

1 голос
/ 30 августа 2010

Вы можете поставить чек в settings.py:

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

Тогда

if not settings.IN_SYNCDB:
    # run SQL code
1 голос
/ 30 августа 2010

Django также должен загрузить urls.py при запуске;Я не могу сказать вам, подходит ли это место для вашего кода, но попробуйте, если хотите!

0 голосов
/ 23 апреля 2012

Как насчет обработки исключений?При выполнении запроса, но таблица базы данных не существует, 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
...