Django模型中有很多函数,如何将其分开?

2024-06-28 10:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有大量的Django应用程序和大量的子应用程序。目前,我正在一个子应用程序中重做模型,所以我得到了一个。。。问题。 我有大量分离的丑陋函数来处理模型。基本上是这样的:

def get_some_things(...):
 def postprocess(...):
  pass
 def preprocess(...):
  pass
 preprocess(...)
 x = MyModel.objects.....get(1)
 return postprocess(x, ...)

我有很多像这样的功能!而且它在当前代码中的使用很难看(比如DatabaseAccessor.get_db().django_kitty().get_some_things(...))。所以,我的想法是让开发人员能够像这样使用这些函数:

^{pr2}$

或者像这样:

MyModel.objects.get_some_things(...)

但是!我有很多函数,所以我不能在里面写模型.py. 所以,我没有什么想法:

  1. 创建模型_我的模型.py定义我的模型,其中包含所有函数和静态函数。但是。。。我不确定,我需要把它放在模型课上吗?在
  2. 创建mymodel_经理.py为mymodel创建模型管理器,在这里定义函数。但是。。。我的一些“函数”应该只返回dicts、list甚至数字。我想知道,让模型管理器能够返回除QuerySet之外的其他内容是否在思想上是错误的?在
  3. 重写MyModel类的__getattr__并动态加载诸如functions_common.pyfunctions_things.py等模块,将收集到的函数存储到字典中并调用所需的?在

Tags: 函数py模型应用程序getobjects定义def
3条回答

我对模型函数和模型管理器使用的指导原则是:只要目标是作用于单个模型对象,我就定期在模型上使用方法函数。然而,如果我的用例要求我处理模型的多个对象,并且满足我的干性动机,我会使用模型管理器来实现这一点。在

如果您的模型需要很多独特的方法,那么拥有庞大的模型定义就是您要付出的代价。如果出于某种原因,您确实希望将功能拆分为其他文件(或者,对于某些实际有用的文件,共享公共功能),您可以使用mixin方法:

#mymodel.py
class MyModelMixin:
    def django_kitty(self, ...):
        pass
    def postprocess(self, ...):
        pass
    def preprocess(self, ...):
        pass

#models.py
from mymodel import MyModelMixin

class MyModel(models.Model, MyModelMixin):
    pass

关于您自己的建议:

1-如果您希望每个模型有单独的文件,可以使用以下方法:

^{pr2}$

请注意,您需要为每个型号显式设置app_标签:

#mymodel.py
class MyModel(models.Model):
    ...
    class Meta:
        app_label = 'myapp'

2-管理器方法的返回值类型无关。管理器和模型的区别在于分别分离级功能。在

3-听起来像是不必要的魔法,覆盖Model.__getattr__是一项痛苦的任务。在

听起来像是第二种选择。在

model manager method not returning a QuerySet没有问题。在

相关问题 更多 >