正确实现数据库范围功能的方法

时间:2011-02-21 08:17:47

标签: python database django django-models coding-style

我正在使用Django创建一个小型网站,我需要使用从数据库中的几个表中获取的数据来计算统计数据。

例如(与我的实际模型无关),对于给定的用户,假设我想要他参加的所有生日派对,以及他在所述派对中与他交谈过的人。为此,我需要一个宽泛的查询,访问几个表。

现在,从面向对象的角度来看,如果User类实现了一个返回该信息的方法,那就太棒了。从数据库模型的角度来看,我根本不喜欢向需要查询其他表的“行实例”添加功能。我想保留Model类中与该单行相关的所有属性和方法,以避免在整个地方分散业务逻辑。

我应该如何实现从面向对象的角度来看属于单个对象的数据库范围的查询?我是否应该拥有一个知道如何收集和整理这些信息的外在的上帝对象?或者是否有更好,更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

我建议使用控制器扩展Django的模型 - 模板 - 视图方法。我的应用程序中通常有一个controller.py,它是数据源的唯一接口。所以在上面的例子中我会有类似get_all_parties_and_people_for_user(user)的内容。

当您的“从数据库中的多个表中获取的数据”变为“从SEVERAL数据库中的多个表中获取的数据”或“从各种来源获取的数据”(例如数据库,缓存后端,外部api等)时,这尤其有用。 ”

答案 1 :(得分:0)

User.get_attended_birthday_parties()或Event.get_attended_pa​​rties(用户)正常工作:它是一个在您使用它时有意义的界面。创建一个额外的“通用”对象不会使您的代码更清晰或更容易维护。