2010-01-22 148 views
4

我想听听你对此的看法。Django过滤器的作用。在视图中过滤或预先格式化?

我有一个django应用程序,从模型中获得的数据很粗糙。为了使它们更好,我必须做一些潜在的复杂操作,但不是太多。 举个例子,假设你有一个模型,其中美国国家编码为两个字母代码。在html渲染中,您想要为用户呈现完整的状态名称。我有另一个数据库表中的通信双字母 - >全名。假设我不想执行连接。

我有两个选择

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

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

对于设计,正确的编码和性能,您有什么看法?

回答

2

在我看来,你的模型应该有一个方法来做转换。这似乎是额外的工作,使过滤器,我不认为大多数Django开发人员会期望过滤器中的那种事情。

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

2

我的看法是,从设计的角度来看,第一种解决方案更清洁。我希望看到模板图层仅作为演示文稿的最后阶段,其中所有信息都以视图的形式传递(以其最终形式)。

在视图中拥有所有“计算逻辑”更好。也就是说,道:

  • 它更容易阅读理解(尤其是第三方)。

  • 我需要变化的东西,你可以专注于一个特定视图的方法,并确保您需要更改一切都在那里(无需从视图中来回切换到模板)。

至于表现,我认为你的观点是对的。如果您想多次执行相同的查找,第二种解决方案会更糟糕。

编辑: 参考ashchristopher的评论,我其实是想说,它绝对不会属于模板。关于“数据提供”和“商业逻辑”之间的界线在哪里,业务逻辑究竟是什么以及哪里是不明确的。在这种情况下,似乎ashchristopher是对的。状态码到全状态名称的转换可能是与数据库相关的编码问题,而不是业务逻辑。

+1

虽然我同意这两个解决方案中的第一个是更好的......我仍然认为这个模型就属于这个范畴。该模型不仅仅是数据库的一个接口。它应该被用来收集和处理数据。 该视图用于执行业务逻辑,并将alpha-2国家/地区代码转换为全名很难做到业务逻辑......它是数据操作。 – ashchristopher 2010-01-22 04:52:39

+0

这是一个很好的观点。编辑我的答案。 – 3lectrologos 2010-01-22 06:30:54