Django 和领域层

标签 django domain-driven-design django-managers

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

我知道我可以编写自定义管理器来保存我的查询,但是如果我想要像规范模式这样更灵活的东西怎么办。

有没有 Django 独有的域模式?

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

最佳答案

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

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

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

    编辑:

    对于“规范模式”,我建议编写一个调用管理器方法来过滤对象的更高级别的模块。与 Q objects您可以创建可以像这样使用的通用过滤器:
    q = Q(field__isnull = False) | Q(otherfield__isnull = False)
    objects = Model.objects.filter(q)
    

    编辑二:

    它让我印象深刻: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)
    

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

    关于Django 和领域层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296068/

    相关文章:

    .net - 静态方法 : When and when not

    Django:如何从管理器内部访问模型的实例?

    python - 在 Windows 上使用 postman 命中 centos6 上存在的 django API

    model - 域逻辑泄漏到其他层?

    php - 领域驱动设计 - 聚合 - EventPublisher with Doctrine

    Django模型与管理器

    javascript - 用户单击元素时如何切换脚本的 src 属性?

    django - 链接到 Django 中的当前页面,是否带有附加 GET 参数?

    带有空 PK 的 Django 模型反序列化