Объявление моделей в другом месте, чем в "models.py" И динамически - PullRequest
1 голос
/ 29 апреля 2010

У меня есть приложение, которое разбивает модели на разные файлы.

На самом деле папка выглядит так:

>myapp
    __init__.py
    models.py
    >hooks
        ...
    ...

myapp не заботится о том, что находится в папке hooks, за исключением того, что есть модели, и что их нужно каким-то образом импортировать и установить с помощью syncdb. Итак, я положил это в myapp.__init__.py:

from django.conf import settings

for hook in settings.HOOKS :
    try :
        __import__(hook)
    except ImportError as e :
        print "Got import err !", e
#where settings.HOOKS = ("myapp.hooks.a_super_hook1", ...) 

Чтобы этот код работал, модели в hooks имеют

class Meta:
    app_label="my_app"

Проблема в том, что он не работает, когда я запускаю syncdb.

Итак, я попытался последовательно:

1)

for hook in settings.HOOKS :
    try :
        exec ("from %s import *" % hook)

-> тоже не работает: syncdb не устанавливает модели в hooks

2)

from myapp.hooks.a_super_hook1 import *

-> Это работает

3)

exec("from myapp.hooks.a_super_hook1 import *")

-> Это работает до

Итак, я проверил, что в тесте 1) выполненный оператор такой же, как в тестах 2) и 3) , и это точно то же самое ...

Есть идеи ???

РЕДАКТИРОВАТЬ: Вопрос можно обобщить так:

Я объявил модели вне "models.py", где нужно разместить МОЙ код импорта, чтобы syncdb нашел модели?

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Django знает обо всех моделях, которые определены в любом месте вашего проекта, поэтому вам нужно только убедиться, что код, в котором они определены, выполняется. Обычно это происходит при импорте модуля, в котором определены модели.

Еще одна важная вещь, которую необходимо знать, это то, что атрибут app_label класса Meta внутри ваших моделей должен быть установлен на имя пакета вашего приложения (myapp в вашем примере). Это необходимо, поскольку syncdb будет устанавливать модели в базе данных только из приложений, указанных в настройке INSTALLED_APPS.

Что касается вашей настройки, описанной в вашем вопросе, вам необходимо:

  1. убедитесь, что модуль, в котором определена модель, импортируется
  2. установить атрибут app_label в классе Meta модели на myapp
  3. введите myapp в настройку INSTALLED_APPS

Дополнительная информация: Еще одно требование в django для работы syncdb на ваших моделях заключается в том, что приложению, в котором определены модели (для которого установлена ​​app_label), необходим файл models.py, даже если он пустой. Но, как описано в вашем вопросе, у вас уже есть этот файл.

0 голосов
/ 03 мая 2010

Хорошо ... У меня есть эта чертова штука.

При импорте моделей syncdb пытается импортировать найденное. Если импорт завершится неудачно, то после отправки будет проверен позже! Вот почему:

for hook in settings.HOOKS :
    try :
        __import__(hook)
    except ImportError as e :
        print "Got import err !", e

не работает с syncdb: поскольку ошибка импорта обнаруживается и не передается, импорт моделей никогда не будет отложен. Поэтому правильный код для этого просто:

for log_hook in settings.LOG_HOOKS :
    try :
        __import__(log_hook)
    except ImportError as e :
        raise e

В этом случае try... except, вероятно, бесполезен.

0 голосов
/ 29 апреля 2010

Если у вас есть файл с именем users_models.py в папке hooks:

Вы могли бы сказать from hooks.users_models import * в myapp.__init__.py верно? Это наверняка подхватит syncdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...