Django和域层

the*_*row 4 django domain-driven-design django-managers

如何使用django组织我的域图层?

我知道我可以编写自定义管理器来保存我的查询,但如果我想要一些更灵活的东西,比如规范模式.

是否有任何Django独有的域模式?

我目前正在设计一个使用Django的大型应用程序,我想知道如何正确地执行域层.

knu*_*tin 5

这个问题有点主观,但这是我的两分钱:

  • 用于同时更改多个对象的业务逻辑通常应该放在管理器中.
  • 思考,创建对象的特殊逻辑应该在经理中 MyModel.objects.create_complex(foo, bar)
  • 用于计算自定义信息,更新某些复杂字段等的业务逻辑应该在模型的方法(或属性)中my_instance.get_accumulated_interest().这些不应该保存模型,只更新一些字段然后返回.
  • 验证信息的业务逻辑应该是clean模型上的clean方法,还是特殊形式的方法.如果它在模型上,它可以更容易地从系统的不同部分重复使用.
  • 一般来说,如果你找不到一个有意义的逻辑的地方,我把它们放在视图中.
  • 离线处理应该进入自定义管理命令,您应该能够多次使用相同的参数重新运行相同的命令,而不会产生任何不必要的影响.

当我说"应该进入X"时,我的意思是系统的这些部分应该调用你自己的模块,这些模块可能与Django完全分开.这可以使单独测试这些功能变得更容易.

编辑:

对于"规范模式",我建议编写一个更高级别的模块来调用管理器方法来过滤对象.使用Q对象,您可以创建可以使用的通用过滤器,如下所示:

q = Q(field__isnull = False) | Q(otherfield__isnull = False)
objects = Model.objects.filter(q)
Run Code Online (Sandbox Code Playgroud)

编辑二:

它让我印象深刻:Python允许非常通用的编程.课程和职能是一等公民.请考虑以下示例:

def HasFooBar(model_class):
    return list(model_class.objects.filter(somefield__contains = 'foobar'))

def BarHasBaz(model_class, arg):
    return list(model_class.objects.filter(somefield = arg))

objects = HasFooBar(MyModel) + BarHasBaz(OtherModel, baz)
Run Code Online (Sandbox Code Playgroud)

你看到我刚刚在那里做了什么?:)