Django管理器代码应该存放在哪里?

25

这是一个相当简单的Django模式问题。我的Manager代码通常存放在models.py中,但是如果models.py非常庞大会怎样呢?有没有其他替代模式可用于使您的Manager代码不再位于models.py中,以提高可维护性并避免循环导入呢?

也许会有人问为什么models.py如此巨大,但让我们假设它的规模和广泛的实用性是合理的。

4个回答

33

我更喜欢将模型放在models.py文件中,将管理器放在managers.py文件中(表单在forms.py中),它们都位于同一个应用程序中。对于更通用的管理器,如果它们可以在其他应用程序中重复使用,则更愿意将它们放在core.managers中。在一些大型应用程序中,我们会在models/modelname.py中包含管理器和模型代码,这似乎也不错。


2
你如何干净地处理需要导入managers.py和models.py之间的相互依赖问题? - Jeff
34
managers.py不应该需要导入models--有关的模型将始终作为' self.model '在管理器上可用。 - jacobian
8
太好了...除非你的经理的QuerySet需要引用另一个模型——那样你就不能导入它,而必须把它放在models.py中(例如,如果你要排除存在于另一个模型中的项目等)。 - Jough Dempsey
3
从django.db.models中导入get_model。 - Izz ad-Din Ruhulessin
1
注意,从Django 1.9开始,django.db.models.get_models / django.db.models.loading.get_models已被弃用,推荐使用:from django.apps import appsapps.get_models()。对于一个特定的模型,请使用:apps.get_model('<app_name>', '<model_name>') - Taylor D. Edmiston
显示剩余2条评论

12

如果您有一大批模型需要处理,最好利用Django的模块化功能。您只需创建一个名为models的文件夹,并将旧的models.py移动到该models文件夹中,并将其重命名为 __init__.py。这将允许您将每个模型分离成更具体的文件,放在这个models文件夹中。

然后,您只需要将每个模型导入到您的__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.

当我的模型文件变得非常大时,我使用这种结构。然而,我尽可能频繁地将事物分离成更可插拔的应用程序,因此很少使用这种结构。

希望这能帮到你。


9

我通常将它放在managers.py中。如果你遇到了循环引用的问题,请记住:a) 你可以通过self.model引用一个管理器的模型类,b) 你可以在函数内部进行导入。


1
+1 提醒我们可以在函数内部导入。在我的情况下,我不得不为我的管理器使用外部模型,并在该方法中添加了“apps.get_model(app_label ='app_name',model_name ='model_name')”。 - jangeador

4
我在构建Django应用程序时所做的是创建一个[modelname].py文件,其中只包含特定的模型代码、管理器代码和有时的表单代码,并使用__init__.py文件将它们全部导入到models目录中。这至少有助于使它易于管理。

如果我要做这个,我会把所有这些文件放在一个名为models的文件夹里。这样可以保持应用程序根目录的清洁,并更好地组织导入。 - jangeador

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接