这是一个相当简单的Django模式问题。我的Manager代码通常存放在models.py中,但是如果models.py非常庞大会怎样呢?有没有其他替代模式可用于使您的Manager代码不再位于models.py中,以提高可维护性并避免循环导入呢?
也许会有人问为什么models.py如此巨大,但让我们假设它的规模和广泛的实用性是合理的。
这是一个相当简单的Django模式问题。我的Manager代码通常存放在models.py中,但是如果models.py非常庞大会怎样呢?有没有其他替代模式可用于使您的Manager代码不再位于models.py中,以提高可维护性并避免循环导入呢?
也许会有人问为什么models.py如此巨大,但让我们假设它的规模和广泛的实用性是合理的。
我更喜欢将模型放在models.py文件中,将管理器放在managers.py文件中(表单在forms.py中),它们都位于同一个应用程序中。对于更通用的管理器,如果它们可以在其他应用程序中重复使用,则更愿意将它们放在core.managers中。在一些大型应用程序中,我们会在models/modelname.py中包含管理器和模型代码,这似乎也不错。
如果您有一大批模型需要处理,最好利用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.
当我的模型文件变得非常大时,我使用这种结构。然而,我尽可能频繁地将事物分离成更可插拔的应用程序,因此很少使用这种结构。
希望这能帮到你。
我通常将它放在managers.py中。如果你遇到了循环引用的问题,请记住:a) 你可以通过self.model引用一个管理器的模型类,b) 你可以在函数内部进行导入。
models
的文件夹里。这样可以保持应用程序根目录的清洁,并更好地组织导入。 - jangeador
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>')
。 - Taylor D. Edmiston