Django和域层

Django和域层,django,domain-driven-design,django-managers,Django,Domain Driven Design,Django Managers,如何使用django组织我的域层 我知道我可以编写自定义管理器来保存我的查询,但是如果我想要更灵活的规范模式呢 有没有Django独有的域模式 我目前正在设计一个使用Django的大型应用程序,我想知道如何正确处理域层 这个问题有点主观,但这是我的两分钱: 通常,用于同时更改多个对象的业务逻辑应该放在管理器中 创建对象的特殊逻辑应该在管理器中,想想MyModel.objects.create\u complex(foo,bar) 用于计算自定义信息、更新某些复杂字段等的业务逻辑应该在模型的方法

如何使用django组织我的域层

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

有没有Django独有的域模式


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

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

  • 通常,用于同时更改多个对象的业务逻辑应该放在管理器中
  • 创建对象的特殊逻辑应该在管理器中,想想
    MyModel.objects.create\u complex(foo,bar)
  • 用于计算自定义信息、更新某些复杂字段等的业务逻辑应该在模型的方法(或属性)中,想想
    my\u instance.get\u cumulated\u interest()
    。这些不应该保存模型,只更新一些字段,然后返回
  • 验证信息的业务逻辑应该在模型上的
    clean
    方法中,或者作为特殊形式的
    clean
    方法。如果它位于模型上,则可以更容易地从系统的不同部分重用它
  • 一般来说,如果你找不到一个地方来放置有意义的逻辑,我会将它们放在视图中
  • 脱机处理应该在自定义管理命令中进行,并且您应该能够使用相同的参数多次重新运行相同的命令,而不会产生任何不必要的影响
当我说“应该进入X”时,我的意思是系统的这些部分应该调用到您自己的模块中,这些模块可能与Django分离在一起。这可能使单独测试这些功能变得更容易

编辑:

对于“规范模式”,我建议编写一个更高级别的模块,调用管理器方法来过滤对象。使用,您可以创建通用过滤器,您可以这样使用:

q = Q(field__isnull = False) | Q(otherfield__isnull = False)
objects = Model.objects.filter(q)
编辑II:

这让我大吃一惊: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)

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

是的,但是规范可以进一步抽象查询。例如:HasFooBar()和().BarHasBaz(),它们是连接在一起的大量查询。谢谢。所以基本上我有另一个层来返回我的查询。美好的