Как Django пропускает приложение при использовании команды syncdb

У меня есть проект Django, в котором есть два приложения (одно создано как тест отладки). Для отладочного теста syncdb помещает модель в базу данных, а для другого — нет.

for model in get_models():  
    models.append(model)  
pass models to a template  

Любая помощь приветствуется. Я думаю, что это что-то тривиальное, но у меня нет идей, что можно попробовать.

Спасибо,

ОБНОВИТЬ:

INSTALLED_APPS = (  
    'django.contrib.auth',  
    'django.contrib.contenttypes',  
    'django.contrib.sessions',  
    'django.contrib.messages',  
    'django.contrib.admin',  
    'techtree',  
    'froink',  
)

Структура:

  • project/techtree/models.py (содержит тестовую модель)
  • project/techtree/models/__init__.py (как описано здесь)
  • project/techtree/models/typ.py (содержит тип модели)

Файлов того же типа, что и в последней строке, больше.


person Mark    schedule 25.04.2011    source источник


Ответы (4)


Вам не хватает файла __init__.py в каталоге моделей второго приложения? Это означало бы, что его нельзя найти на пути.

Не могли бы вы показать нам настройки INSTALLED_APPS и структуру каталогов, пожалуйста?

Глядя на вашу структуру каталогов, я думаю, что могу догадаться, что не так.

my_app/
    __init__.py
    my_module.py
    my_module/
        __init__.py
        my_python_file.py

С приведенной выше вымышленной структурой каталогов, что будет импортировано, когда я сделаю следующее?

from my_module import *

Это импортирует все из my_module.py или все из каталога my_module?

Используйте то или иное. Не оба. Поместите все в свой файл models.py и избавьтесь от каталога, если у вас нет веской причины иметь каталог models. Вы, вероятно, нет.

person Josh Smeaton    schedule 25.04.2011
comment
Спасибо за ответ, я добавил запрошенную информацию - person Mark; 25.04.2011
comment
Fck я глупый, должен был подумать об этом ... Спасибо за ответ, тестовая модель в models.py теперь распознается! Я посмотрю, смогу ли я заставить каталог работать (с удаленными моделями.py) и в остальном придерживаться этого. - person Mark; 25.04.2011
comment
@Mark, поместить все ваши модели в один файл в python довольно естественно. Если вам необходимо выделить их в отдельные файлы, обязательно импортируйте все модели, доступные извне, в файл models/__init__.py. ГЛ - person Josh Smeaton; 25.04.2011

Я столкнулся с той же проблемой. Мне потребовались часы, чтобы понять, как сгруппировать модели в отдельный каталог. Вот как это сделать,

Добавьте метакласс в каждую из ваших моделей с параметром app_label.

from django.db import models

class Test(models.Model):
    class Meta:
        app_label = 'myapp'

Вот где я узнал об этом, Размещение Django Модели в отдельных файлах

Но сделать этого было недостаточно, вам нужно импортировать модели в файл __init__.py в каталоге моделей следующим образом:

from YourModelFile import *
person vim    schedule 20.05.2011

Django обычно ищет только models.py файл. Если у вас есть models.py и подкаталог модуля с именем models с файлом __init__.py, он неправильно распознает модели (мое предположение). Вы можете сделать одно из этих двух:

  • Полностью удалите свой подмодуль и сохраните все определения вашей модели в models.py

OR

  • Удалите models.py в techtree. Добавьте файл models.py в свое techtree.models приложение, в котором хранятся определения модели. Добавьте 'techtree.models' к INSTALLED_APPS (просто 'techtree' недостаточно).

Надеюсь, что один из этих ответов поможет.

person Torsten Engelbrecht    schedule 25.04.2011
comment
Добавление каталога моделей в установленные приложения не сработает. INSTALLED_APPS используется для таких вещей, как поиск шаблонов и статического содержимого, а не только для определения моделей. - person Josh Smeaton; 25.04.2011
comment
Добавление означает добавление. Не удаляя 'techtree' и вместо этого добавляя 'techtree.models'. Добавьте как теги шаблонов, так и статические файлы. - person Torsten Engelbrecht; 25.04.2011

Проверьте, что имя файла

__init__.py

и не

init.py

person Timbadu    schedule 25.04.2011
comment
Да, это немного сбивает с толку, я набрал __ init__, но я не очень хорошо знаком с языком здесь, поэтому он был выделен жирным шрифтом, а не просто отображал то, что я набрал; Извини за это. - person Mark; 25.04.2011