Как * не * запустить код Django на SyncDB
-
02-10-2019 - |
Вопрос
У меня есть какой-то код запуска сервера, который лежит в «моделях .py» одного из моих приложений Django. Мне нужно запустить этот код в запуске сервера.
Проблема в том, что код выдает запрос SQL, который предотвращает работу меня syncdb
с участием psycopg2
(Это разрушает транзакцию, а таблицы не созданы.)
Положить код в промежуточное программное обеспечение и повышение django.core.exceptions.MiddlewareNotUsed
Не оптимально, поскольку я хотел бы иметь эффект в оболочке Django тоже (и в любом случае не звучит код инициализации в промежуточное программное обеспечение.) Также мне нужно будет дождаться первого запроса. Я хочу запустить код на запуске сервера, а не когда первый клиент поставляется на моем сайте.
Сигналы запуска сервера все еще не реализованы в Django, так что это не вариант.
Таким образом, я хотел бы как-то:
- Проверьте, запущена ли Django SyncDB, поэтому я не делаю запросов,
- Или, альтернативно, проверьте его соответствующие таблицы, а если они не, то тоже не делайте никаких запросов
Не из вышеупомянутых двух вариантов я нашел в любой из документов. Как я могу это сделать? Или есть лучший (то есть здравый) способ делать то, что я хочу сделать?
Решение
Django должен также загрузить urls.py
на старте; Я не могу сказать вам, что это подходящее место для вашего кода, но попробуйте, если хотите!
Другие советы
Вы считаете подключение к post_syncdb
сигнал? Возможно, вы можете запустить пользовательский SQL на получении этого сигнала. Это может решить на части вашей проблемы; Вы все еще должны выяснить, как запустить SQL на запуск сервера.
Вы можете положить проверку в настройках .py:
import sys
...
IN_SYNCDB = ('syncdb' in sys.argv)
потом
if not settings.IN_SYNCDB:
# run SQL code
Как насчет кусочка обращения с исключением? При выполнении запроса, но таблица базы данных не существует, Django.db.utils.DatabaseError
Поднялся. Попробуйте ..Except Код запроса - это способ удовлетворения ваших второго критериев, как я думаю.
Проблема: модели
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