Проект 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.