【发布时间】:2017-03-29 22:18:28
【问题描述】:
我有一个用例,我想在 Django 应用程序中为用户(由业务逻辑自动生成)捕获各种类型的提醒。在所有提醒中,属性相同(即owner、creator、creation_time、status、completion_time)并且它们具有相同的接口(即render_message()、is_valid())。但是,提醒的类型有很多种,对于这些常用功能,每种提醒都应该有自己的实现细节。
由于模型属性永远不会改变,因此使用单个 Django 模型似乎是有意义的,但是我质疑从模型实例到函数的具体实现的最佳方式,例如 render_message()。
我目前正在考虑在 Reminder 模型上添加一个名为 type 的 ChoiceField,它将映射到各种提醒类型类,然后在 Reminder 中有一个帮助函数,它将实例化适当的提醒类型类基于self.type 并将其称为render_message() 之类的功能。
我错过了更好的方法吗?不知道这种模式被认为是什么,或者在哪里可以找到具有与同一接口的各种实现相关联的单个 Django 模型的类似示例。
【问题讨论】:
-
您能否举例说明
render_message的各种实现有何不同? -
您可以使用
class Meta: abstract = True甚至@abc.abstractmethod,但我从来不需要这些Javaism。如果您正在处理始终具有 render_message() 的提醒,只需调用它即可。如果 EatReminder 有不同的 render_message,覆盖它。 -
@AntoinePinsard 每个提醒都与一个项目对象相关联。一种提醒类型可能是过期项目,因此 render_message 将返回
"<project_name> is over due by x days"。另一种提醒类型可能是对于在一定天数内没有任何更新的项目,render_message 实现将返回"<project_name> hasn't been updated in x days"。实际上有几十种不同的场景。
标签: django django-models architecture