Проект Django models.py в сравнении с app models.py
Я изучаю Django, и я пытаюсь понять использование models.py в проекте по сравнению с приложением. Как видно из примеров учебников, я включаю определение модели в приложение, но когда я пошел применять эти знания к своей собственной существующей базе данных, я застрял.
Я взял базу данных, которую я использую (копия, конечно), и создал концептуальную схему в качестве модели django с помощью inspectdb. Я сделал это на уровне проекта, и предположил, что тогда я мог бы писать приложения, используя подсхемы в приложениях для этого проекта.
Но, обобщая учебник, они определяют модель в приложении model.py. Если бы я это сделал, я бы повторил модель (или ее часть), которая уже на уровне проекта, что кажется ошибкой и проблемой обслуживания.
Итак, как в стиле Django я использую схему проекта (или ее части) без переопределения его в приложении models.py?
Спасибо заранее.
Ответы
Ответ 1
Не должно быть причин иметь "модели уровня проекта" (или "представления уровня проекта", если на то пошло). Вам просто нужно разделить функциональность на отдельные приложения.
Скажем, вы разрабатываете сайт интрасети для школы. У вас будет одно приложение, которое занимается учетными записями студентов, и другое приложение, создающее расписания, и еще одно для внутренней доски объявлений и т.д. Каждое приложение определяет свои собственные модели (нет "моделей уровня проекта" ), но приложения могут импортировать модели друг друга (поэтому сообщения в сообщениях могут иметь поле ForeignKey, указывающее на ученика из приложения "учеников" ).
См. также Джеймс Беннетт "написание многоразовых приложений Django" из DjangoCon 2008.
Ответ 2
-
Модель должна быть определена только один раз в проекте Django
-
Модель должна существовать в приложении в рамках проекта
-
Вы можете получить доступ к другим моделям приложений, импортировав их
-
Если вам нужно "добавить" к существующей модели, она может быть унаследована (см. многостраничное наследование). Это довольно просто, но если вы только начинаете, вы можете оставить это на потом.
Ответ 3
Модели Django могут находиться только в приложениях, а не в самом проекте. По умолчанию manage.py inspectdb
выводит содержимое файла models.py
, и он вам подходит, чтобы поместить его в нужное место.
В вашем случае было бы проще поставить все в одном приложении, а затем разбить его в тех местах, где это будет иметь смысл.
Я не уверен, что состояние с текущей версией, но до появления модуля models
в пакете было указание, что это приложение django и может быть помещено в список INSTALLED_APPS
.