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

时间:2009-12-10 19:21:00

标签: python django design-patterns django-models django-managers

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

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

4 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分: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

然后你的__init__.py就可以了:

from basic import * # You should replace * with each models name, most likely.
from managers import YourManager # Whatever your manager is called.

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

希望这有帮助。

答案 2 :(得分:6)

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

答案 3 :(得分:3)

我在构建Django应用程序时所做的是创建一个[modelname] .py文件,只包含特定的模型代码,管理器代码,有时还有表单代码,并使用__init__.py文件导入模型目录中的所有文件。这有助于我保持它的可管理性。