【问题标题】:Is it an anti-pattern to send a request object to a model method in Django?将请求对象发送到 Django 中的模型方法是一种反模式吗?
【发布时间】:2016-09-02 08:22:46
【问题描述】:

我目前正在尝试使用fat model, thin view 模式,将几乎所有逻辑都转移到模型方法中。

在执行此操作时,我经常发现自己将 request 对象从视图发送到模型方法:

model_method(request)

并以下列方式使用它:

def model_method(self, request):
    user_id = request.user.id
    user_type = request.user.__class__.__name__

    ...

这是个好主意吗?或者我应该将我想要的从请求对象发送到方法,而不是整个对象,如下所示:

user_id = request.user.id
user_type = request.user.__class__.__name__

model_method(user_id, user_type)

正确的方法是什么?

【问题讨论】:

  • 听起来它破坏了 django 在创建方面做得很好的 MVC,但这只是我的看法。您的问题是基于意见和题外话。
  • 这类问题总是取决于您的项目要求、业务模型等...但是,我们使用来避免在层之间发送不必要的信息...很多东西:安全性、性能、可维护性……
  • 一旦您开始传递请求只是为了访问一个或两个属性,您将其视为有点像God object。当您只需要一个 User 实例时,您在请求对象和您的方法之间引入了不必要的紧密耦合。稍后,当您实际上没有请求对象时,您可能需要使用用户对象调用此方法。在其他情况下,您可能需要请求(例如访问会话或设置 cookie),因此传递请求是唯一有意义的解决方案。
  • @knbk 谢谢!如果您可以将其发布为答案,我会接受它

标签: python django design-patterns


【解决方案1】:

@knbk 作为评论发布的答案:

一旦您开始传递请求只是为了访问一两个属性,您就有点像对待上帝对象一样对待它。当您只需要一个 User 实例时,您在请求对象和您的方法之间引入了不必要的紧密耦合。稍后,当您实际上没有请求对象时,您可能需要使用用户对象调用此方法。在其他情况下,您可能需要请求(例如访问会话或设置 cookie),因此传递请求是唯一有意义的解决方案

【讨论】:

    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2011-04-02
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多