2010-03-19 1 views
14

Чтобы разместить мои модели в подпапках, я попытался использовать мета-поле app_label, как описано here.Модель в подкаталоге через app_label?

Моя структура каталогов выглядит следующим образом:

  • проект
    • приложения
      • Foo
        • модели
          • __init_ _.py
          • bar_model.py

В bar_model.py я определяю свою модель, как это:

from django.db import models 

class SomeModel(models.Model): 

    field = models.TextField() 

    class Meta: 
     app_label = "foo" 

Я могу успешно импортировать модель такая:

from apps.foo.models.bar_model import SomeModel 

Однако, бег:

./manage.py syncdb 

не создает таблицу для модели. Однако в подробном режиме я вижу, что приложение «foo» правильно распознано (оно находится в INSTALLED_APPS в settings.py). Перемещение модели на models.py под foo действительно работает.

Существует ли какое-либо конкретное соглашение, не документированное с помощью app_label или со всем механизмом, который предотвращает распознавание этой структуры модели с помощью syncdb?

ответ

18

См Джанго билет #10985: Explain how models can be organised in a directory

Это может быть, что вы не импортировать модели в __init__.py?

+0

Точно! Теперь это работает. – nikola

+2

Спасибо! Да, вам нужно будет импортировать их в '__init __. Py' и дать им' app_label' через класс 'Meta' модели. –

+0

Важное дополнение из @ mustafa.0x вы * должны * предоставить такую ​​же app_label, что и имя метки, которое вы предоставляете, в качестве имени модуля или того, которое вы предоставили в реестре AppConfig, если бы он не возвращал пустой OrderedDict(), если вы получите apps.get_app_config ('app_label'). модели после импорта django.apps.apps – danigosa

3

syncdb не создает таблицы для моделей, не расположенных в <appname>.models, поэтому импортируйте их там, например. from apps.foo.models import SomeModel.

+0

Нет, это тоже не работает, то есть syncdb не выбирает SomeModel. – nikola

+0

EDIT: Теперь я понимаю, что вы указывали в том же направлении, что и Ван Гейл. Я отметил его как правильный ответ, потому что он также содержит ссылку на обсуждение правильной документации app_label. – nikola

 Смежные вопросы

  • Нет связанных вопросов^_^