Указания моего руководителя: «Я не хочу помещать какую-либо логику в models.py
. С этого момента давайте использовать это только как классы для доступа к базе данных, и сохраним всю логику во внешних классах, которые используют классы моделей или обертывают их».
Я чувствую, что это неправильный путь. Я считаю, что убирать логику из моделей только для того, чтобы файл был небольшим, - плохая идея. Если логика лучше всего подходит для модели, она действительно должна идти именно туда, независимо от размера файла.
Так есть ли простой способ просто использовать include? Говоря языком PHP, я хотел бы предложить супервизору, что у нас models.py
есть только include () классы моделей из других мест. Концептуально это позволило бы моделям иметь всю необходимую нам логику, но при этом уменьшать размер файла за счет увеличения количества файлов (что приводит к меньшему количеству проблем с контролем версий, таких как конфликты и т. Д.).
Итак, есть ли простой способ удалить классы моделей из файла models.py, но при этом модели работают со всеми инструментами Django? Или есть совершенно другое, но элегантное решение общей проблемы "большого" файла models.py? Любой вклад будет оценен.
источник
Ответы:
Django разработан, чтобы вы могли создавать множество небольших приложений вместо одного большого.
Внутри каждого большого приложения есть множество небольших приложений, которые пытаются быть бесплатными.
Если вы
models.py
чувствуете себя большим, вы делаете слишком много. Стоп. Расслабьтесь. Разложить.Найдите более мелкие, потенциально пригодные для повторного использования небольшие компоненты или части приложения. На самом деле вам не нужно использовать их повторно. Подумайте о них как о потенциально многоразовых.
Обдумайте свои пути обновления и разложите приложения, которые вы, возможно, захотите когда-нибудь заменить. На самом деле вам не нужно заменять их, но вы можете рассматривать их как отдельный «модуль» программирования, который в будущем может быть заменен чем-то более крутым.
У нас около десятка приложений, каждое
model.py
не более 400 строк кода. Все они сосредоточены на менее чем полдюжине определений дискретных классов. (Это не жесткие ограничения, это наблюдения за нашим кодом.)Разлагаемся рано и часто.
источник
Для классов модели естественно содержать методы для работы с моделью. Если у меня есть модель Book с методом
book.get_noun_count()
, это то, чему она принадлежит - я не хочу писать "get_noun_count(book)
", если только метод действительно не принадлежит какому-то другому пакету. (Может - например, если у меня есть пакет для доступа к API Amazon с "get_amazon_product_id(book)
".)Я вздрогнул, когда документация Django предложила поместить модели в один файл, и с самого начала мне потребовалось несколько минут, чтобы понять, как разбить его на подходящий подпакет.
__init__.py
похоже:from .book import Book
так что я все еще могу написать "from site.models import Book".
Единственная уловка заключается в том, что вам нужно явно установить приложение каждой модели из-за ошибки в Django: он предполагает, что имя приложения является предпоследней записью в пути к модели. "site.models.Book" дает "сайт", что правильно; "site.models.book.Book" заставляет его думать, что название приложения - "модели". Это довольно неприятный прием со стороны Django; вероятно, ему следует поискать совпадение по префиксу в списке установленных приложений.
class Book(models.Model): class Meta: app_label = "site"
Вы, вероятно, могли бы использовать базовый класс или метакласс, чтобы обобщить это, но я пока не озаботился этим.
источник
Я не могу понять, какая из многих возможных проблем может быть у вас. Вот несколько вариантов с ответами:
несколько моделей в одном файле
Поместите их в отдельные файлы. Если есть зависимости, используйте импорт для получения дополнительных моделей.
посторонняя логика / служебные функции в models.py
Поместите дополнительную логику в отдельные файлы.
статические методы для выбора некоторых экземпляров модели из базы данных
Создайте нового менеджера в отдельном файле.
методы, очевидно связанные с моделью
save, __unicode__ и get_absolute_url являются примерами.
источник