models.py变得越来越大,打破它的最佳方法是什么?

Edd*_*ied 86 python django django-models models

来自我的主管的指示:"我想避免在其中添加任何逻辑models.py.从现在开始,让我们将其用作访问数据库的类,并将所有逻辑保留在使用模型类的外部类中,或者将它们包装起来."

我觉得这是错误的方式.我认为保持模型逻辑只是为了保持文件小是一个坏主意.如果逻辑在模型中是最好的,那么无论文件大小如何,它都应该去.

那么有一个简单的方法来使用包含?在PHP中,我想向主管建议我们只有models.pyinclude()来自其他地方的模型类.从概念上讲,这将允许模型具有我们想要的所有逻辑,但通过增加文件数量来减少文件大小(这会导致较少的修订控制问题,如冲突等).

那么,是否有一种从models.py文件中删除模型类的简单方法,但仍然可以使用所有Django工具的模型?或者,对于"大型"models.py文件的一般问题,是否存在完全不同但优雅的解决方案?任何输入将不胜感激.

Gle*_*ard 102

模型类包含在模型上操作的方法是很自然的.如果我有一个Book模型,有一个方法book.get_noun_count(),那就是它所属的地方 - 我不想写" get_noun_count(book)",除非该方法实际上本质上属于其他一些包.(例如,如果我有一个用于通过" get_amazon_product_id(book)" 访问亚马逊API的软件包.)

当Django的文档建议将模型放在一个文件中时,我感到很沮丧,我从一开始就花了几分钟时间弄清楚如何将它拆分成一个合适的子包.

site/models/__init__.py
site/models/book.py
Run Code Online (Sandbox Code Playgroud)

__init__.py 好像:

from .book import Book
Run Code Online (Sandbox Code Playgroud)

所以我仍然可以写"from site.models import Book".


以下仅适用于Django 1.7之前的版本,请参阅 https://code.djangoproject.com/ticket/3591

唯一的技巧是由于Django中的错误,您需要显式设置每个模型的应用程序:它假定应用程序名称是模型路径中倒数第三个条目."site.models.Book"导致"site",这是正确的; "site.models.book.Book"使它认为应用程序名称是"模型".这是Django的一个非常讨厌的黑客攻击; 它应该可以在已安装的应用程序列表中搜索前缀匹配.

class Book(models.Model):
    class Meta: app_label = "site"
Run Code Online (Sandbox Code Playgroud)

您可以使用基类或元类来概括这一点,但我还没有打扰过它.

  • 当你的模型与内在紧密相关时,我看不到把东西拆分成一堆应用程序的好处. (32认同)
  • 哇,将近 10 年后,我仍然喜欢这个解决方案。同意这是比将代码拆分为更小的应用程序更好的方法,在我看来,这会导致难以推理的代码库。 (3认同)
  • +1我成功地使用了它.虽然S. Lott在多个应用程序中是正确的,但这是现在和现在的解决方案. (2认同)
  • 这让我感兴趣.我阅读了发布的django wiki链接scompt,发现:"这已经过验证,在当前的主分支中没有Meta类app_labels." 那么这是否意味着如果你正在使用主分支我们可以丢弃Meta:app_label的东西?这是令人困惑的,因为它是关于解决这个问题的票的评论之后. (2认同)
  • 我刚刚测试了trunk(截至今天早些时候,r11286); 如果未设置app_name,则模型不会显示在"sqlall appname"中,并且可能不会由syncdb创建(但我不使用它,因此我无法测试它).这是一个非常令人困惑的错误情况,因为它不会触发任何错误; 它只是默默地没有出现. (2认同)

S.L*_*ott 63

Django旨在让您构建许多小应用程序而不是一个大型应用程序.

在每个大型应用程序中都有许多小型应用程序在努力获得自由.

如果你models.py感觉很大,那你就做得太多了.停止.放松.分解.

查找较小的,可能可重复使用的小型应用程序组件或部件.您不必实际重用它们.试想一下它们可能是可重用的.

考虑您的升级路径并分解您可能希望在某一天更换的应用程序.您不必实际替换它们,但您可以将它们视为编程的独立"模块",可能会被未来更酷的东西取代.

我们有大约十几个应用程序,每个应用程序model.py不超过400行代码.他们都非常专注于不到六个不同的类定义.(这些不是硬限制,它们是对我们代码的观察.)

我们早期和经常分解.

  • Glenn Maynard对这个问题的回答要好得多.将复杂的Web应用程序划分为多个应用程序当然是一种很好的做法,但在应用程序中重构一个model.py文件也是如此.这两个动作可以是正交的. (12认同)
  • 虽然这是"正确的"方式,并且有助于了解,但这并不是我想要的.如果没有办法知道我在寻找什么样的答案,我道歉.:) (4认同)

hug*_*own 6

我不太清楚您可能遇到的许多问题中的哪一个。以下是一些可能的答案:

  • 同一文件中的多个模型

    将它们放入单独的文件中。如果存在依赖关系,请使用 import 拉入其他模型。

  • models.py 中的无关逻辑/实用功能

    将额外的逻辑放入单独的文件中。

  • 从数据库中选择一些模型实例的静态方法

    在单独的文件中创建一个新的管理器

  • 与模型明显相关的方法

    save, __unicode__ 和 get_absolute_url 是例子。