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 apps
和 apps.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 应用程序中发送每周电子邮件。从数据库中提取数据并实时发送电子邮件的代码应该在哪里?