Для классов модели естественно содержать методы для работы с моделью. Если у меня есть модель Book с методом book.get_noun_count()
, это то, к чему она относится - я не хочу писать «get_noun_count(book)
», если только метод на самом деле не принадлежит другому пакету. (Это может быть - например, если у меня есть пакет для доступа к API Amazon с «get_amazon_product_id(book)
».)
Я съежился, когда в документации Django предлагалось поместить модели в один файл, и мне понадобилось несколько минут с самого начала, чтобы выяснить, как разбить его на надлежащий подпакет.
site/models/__init__.py
site/models/book.py
__init__.py
выглядит так:
from .book import Book
так что я все еще могу написать "с сайта import.models Book".
Следующее требуется только для версий, предшествующих Django 1.7, см.
https://code.djangoproject.com/ticket/3591
Единственная хитрость заключается в том, что вам необходимо явно установить приложение каждой модели из-за ошибки в Django: она предполагает, что имя приложения является третьей в последней записи в пути модели. «site.models.Book» приводит к «site», что является правильным; «site.models.book.Book» заставляет его думать, что имя приложения - «models». Это довольно неприятный хак со стороны Джанго; вероятно, он должен искать в списке установленных приложений совпадение префиксов.
class Book(models.Model):
class Meta: app_label = "site"
Возможно, вы могли бы использовать базовый класс или метакласс для обобщения этого, но я еще не беспокоился об этом.