【问题标题】:Role of django filters. Filtering or upfront formatting within the view?django过滤器的作用。在视图中过滤或预先格式化?
【发布时间】:2010-01-22 04:28:29
【问题描述】:

我想听听您对此的看法。

我有一个 django 应用程序,从模型中获得的数据是粗糙的。为了使它们更好,我必须做一些可能复杂但不多的操作。 例如,假设您有一个模型,其中美国州被编码为两个字母代码。在 html 渲染中,您希望向用户呈现完整的状态名称。我在另一个数据库表中有一个对应的两个字母-> 全名。假设我不想执行连接。

我有两个选择

  1. 让视图代码从模型中提取双字母信息,然后对第二个表执行查询,获取全名,并将其放入上下文中。模板呈现完整的状态名称。
  2. 创建一个自定义过滤器,该过滤器接受两个字母的代码、命中数据库并返回全长名称。让视图将两个字母的信息传递到上下文中,并将管道放入过滤器的模板中。过滤器将两个字母的代码呈现为一个完整的字符串。

现在,这些解决方案看起来是等价的,但从设计的角度来看,它们不可能是等价的。我有点怀疑在过滤器责任和视图责任之间划清界限。解决方案 1 正在执行解决方案 2 中的过滤器任务,它只是集成在视图本身中。当然,如果我必须在同一页面内多次调用过滤器,解决方案 1 可能更快(除非过滤器输出被记忆)。

您对设计、正确编码和性能有何看法?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    在我看来,您的模型应该有一种方法来进行转换。制作过滤器似乎是额外的工作,而且我认为大多数 Django 开发人员不会期望过滤器中有这种东西。

    过滤器旨在更通用 - 格式化和显示数据而不是查找。

    【讨论】:

      【解决方案2】:

      我的意见是,从设计的角度来看,第一个解决方案要干净得多。我希望将 模板 层视为 presentation 的最后阶段,其中所有信息都由视图传递(以其最终形式)。

      最好在视图中包含所有“计算逻辑”。那,方式:

      • 阅读理解要容易得多(尤其是对于第三方而言)。

      • 您需要更改一些东西,您可以专注于特定的视图方法,并确保您需要更改的所有内容都在其中(无需在视图中来回切换到模板)。

      关于性能,我认为你的观点是正确的。如果您想多次执行相同的查找,则第二种解决方案更糟糕。

      编辑: 参考 ashchristopher 的评论,我实际上是想说它确实 属于模板。什么是业务逻辑以及“数据提供”和“业务逻辑”之间的界限在哪里,从来都不是很清楚。在这种情况下,ashchristopher 似乎是对的。将状态代码转换为完整的状态名称可能是与数据库相关的编码问题,而不是业务逻辑问题。

      【讨论】:

      • 虽然我同意,在 2 个解决方案中,第一个更好......我仍然认为模型是它所属的地方。该模型不仅仅是数据库的接口。它应该用于收集和操作数据。该视图用于执行业务逻辑,将 alpha-2 国家代码转换为全名几乎不是业务逻辑……它是数据操作。
      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 2018-05-08
      • 2017-01-08
      • 2022-01-10
      • 2020-04-17
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多