2014-01-17 1 views
1

У меня есть приложение Django, который имеет такую ​​структуру:Тест-модели Django загружаются в зависимости от их местоположения?

app/ 
    tests/ 
     __init__.py 
     tests.py 
    __init__.py 
    test_model.py 

В tests.py я импортировать тестовую модель, как: from app.test_model import *. Это работает так, как ожидалось: во время тестирования загружаются модели, создаются соответствующие таблицы базы данных и так далее.

Но, если я двигаю test_model.py файл в каталоге tests/:

app/ 
    tests/ 
     __init__.py 
     test_model.py 
     tests.py 
    __init__.py 

И сделать импорт соответственно: from app.tests.test_model import *, он внезапно выходит из строя. Модели не обнаружены, поэтому их таблицы базы данных не создаются, и тесты начинают сбой (DatabaseError: no such table: app_model).

Почему это происходит? Как следует избегать этого и по-прежнему размещать файл test_model.py в tests/?

+0

Какой версии Django вы используете? –

+0

Я использую Django 1.4.10 – linkyndy

+0

Возможный дубликат [Организация модульных тестов Django] (http://stackoverflow.com/questions/5160688/organizing-django-unit-tests) – sleepycal

ответ

1

Я предполагаю, что test_models.py на самом деле, где вы создаете все свои модели. Django ищет имя приложения модели в качестве родительской папки и вложенное в него, поскольку вы можете заставить его застрять в поиске имени приложения. Я не совсем понимаю механику здесь, но я испытал это раньше. Самое простое решение, чтобы вручную указать приложение с помощью Meta option:

class MyModel(Model): 

    ... 

    class Meta: 
     app_label = 'app' 
+0

Это было! Большое спасибо за это исправление :) – linkyndy

-1

Вы должны использовать локальный импорт в пакете:

from .test_model import * 
+0

Это тот же результат, модели, определенные в 'test_model .py' не загружены, ни их таблицы. – linkyndy

+0

Тогда вы могли бы упустить возможность динамического создания моделей, как упоминалось в этом [SO answer] (http://stackoverflow.com/a/2672444/3107299) – arocks

+0

Ответ @ aquavitae был более чистым и более «Djangoish». Спасибо за помощь :) – linkyndy