django manager 代码应该在哪里?

Posted

技术标签:

【中文标题】django manager 代码应该在哪里?【英文标题】:Where should django manager code live? 【发布时间】:2010-12-25 09:29:10 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你如何干净地处理需要导入managers.py的models.py,反之亦然? managers.py 不需要导入模型 - 有问题的模型将始终在管理器上以 self.model 的形式提供。 那太好了...除非您的经理的 QuerySet 需要引用另一个模型 - 那么您不能导入它,并且必须将它放在 models.py 中(例如,如果您排除存在于其他型号等)。 从 django.db.models 导入 get_model @Izzad-DinRuhulessin 请注意,从 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>')【参考方案2】:

拥有大量模型的最佳选择是使用 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.

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

希望这会有所帮助。

【讨论】:

【参考方案3】:

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

【讨论】:

+1 提醒我们您可以在函数内部导入。在我的情况下,我不得不为我的经理使用外部模型,并在方法中添加了 apps.get_model(app_label='app_name', model_name='model_name')【参考方案4】:

我在构建 Django 应用程序时所做的是创建一个 [modelname].py 文件,其中仅包含特定的模型代码、管理器代码,有时还有表单代码,然后使用 __init__.py 文件将所有内容导入模型目录中。这至少帮助我保持了可管理性。

【讨论】:

如果我要这样做,我会将所有这些文件放在models 文件夹中。它将保持应用程序根目录干净并更好地组织导入。

以上是关于django manager 代码应该在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?

我想在我的 Django 应用程序中发送每周电子邮件。从数据库中提取数据并实时发送电子邮件的代码应该在哪里?

什么时候应该使用 django-admin.py 和 manage.py?

Django基本知识

Django - 保存表单的位置

Django:如何告诉 Django 它应该在哪里寻找应用程序?