模型类包含对模型进行操作的方法是很自然的。如果我有一个带有方法的 Book 模型,book.get_noun_count()
那就是它所属的地方——我不想写“ get_noun_count(book)
”,除非该方法实际上本质上属于某个其他包。(它可能——例如,如果我有一个使用“ get_amazon_product_id(book)
”访问亚马逊 API 的包。)
当 Django 的文档建议将模型放在一个文件中时,我感到畏缩,我从一开始就花了几分钟来弄清楚如何将它拆分为适当的子包。
site/models/__init__.py
site/models/book.py
__init__.py
好像:
from .book import Book
所以我仍然可以写“从 site.models 导入书”。
以下内容仅适用于 Django 1.7 之前的版本,请参阅
https://code.djangoproject.com/ticket/3591
唯一的技巧是,由于 Django 中的一个错误,您需要显式设置每个模型的应用程序:它假定应用程序名称是模型路径中的倒数第三个条目。“site.models.Book”的结果是“site”,这是正确的;“site.models.book.Book”使它认为应用程序名称是“models”。这对 Django 来说是一个非常讨厌的 hack。它可能应该在已安装应用程序列表中搜索前缀匹配。
class Book(models.Model):
class Meta: app_label = "site"
您可能可以使用基类或元类来概括这一点,但我还没有为此烦恼。