django经理代码应该在哪里生活?

ecu*_*ver 22 python django design-patterns django-models django-managers

这是一个非常简单的django模式问题.我的经理代码通常存在于models.py中,但是当models.py非常庞大时会发生什么?是否有任何其他替代模式可让您的经理代码在models.py中生存,以实现可维护性并避免循环导入?

可能会问一个问题,为什么models.py是如此巨大,但让我们假设它的大小和实用性的广度是合理的.

小智 28

我更喜欢将models.py中的模型和managers.py中的管理器(forms.py中的表单)保存在同一个应用程序中.对于更通用的管理器,我更喜欢将它们保留在core.managers中,如果它们可以重用于其他应用程序.在我们的一些较大的应用程序中,models/modelname.py将包含一个管理器和模型代码似乎并不坏.

  • managers.py不需要导入模型 - 有问题的模型将始终作为管理器上的`self.model`提供. (27认同)
  • 这很好......除非你的经理的QuerySet需要引用另一个模型 - 然后你不能导入它,并且必须把它放在models.py中(例如,如果你要排除另一个模型中存在的项目等). (7认同)
  • 那么你如何干净地处理需要导入 manager.py 的模型.py,反之亦然? (2认同)
  • 来自django.db.models导入get_model (2认同)

mon*_*ome 9

使用大量模型最好的方法是使用django模块,只需创建一个名为models的文件夹.将旧的models.py移动到此模型文件夹中,然后重命名__init__.py.这将允许您将每个模型分成此模型文件夹内的更具体的文件.

然后,您只需要将每个模型导入到您__init__.py的命名空间中.

因此,例如,您可能希望将其分为:

yourapp/
    models/
        __init__.py # This file should import anything from your other files in this directory
        basic.py # Just an example name
        morespecificmodels.py # Just an example name
        managers.py # Might want to separate your manager into this
Run Code Online (Sandbox Code Playgroud)

然后你__init__.py可以只是:

from basic import * # You should replace * with each models name, most likely.
from managers import YourManager # Whatever your manager is called.
Run Code Online (Sandbox Code Playgroud)

这是我在模型文件变得庞大时使用的结构,但是我尝试尽可能多地将事物分成更多可插拔的应用程序 - 所以我很少使用它.

希望这可以帮助.


Ale*_*nor 6

我总是把我放在managers.py中.如果您有循环导入问题,请记住a)您可以在self.model中为经理引用模型类,并且b)您可以在函数内部进行导入.