我正在Django中编写一个项目,并且看到80%的代码在file中models.py。这段代码令人困惑,并且在一段时间之后,我不再了解实际发生的事情。
这是困扰我的事情:
我发现模型级别(应该只负责处理数据库中的数据)在发送电子邮件,使用API到其他服务等方面也很丑陋。
另外,我发现在视图中放置业务逻辑也是不可接受的,因为这样很难控制。例如,在我的应用程序中,至少有三种方法来创建的新实例User,但从技术上讲,它应统一创建它们。
我并不总是注意到模型的方法和属性何时变得不确定,以及何时出现副作用。
这是一个简单的例子。首先,User模型是这样的:
class User(db.Models):
def get_present_name(self):
return self.name or 'Anonymous'
def activate(self):
self.status = 'activated'
self.save()
随着时间的流逝,它变成了:
class User(db.Models):
def get_present_name(self):
# property became non-deterministic in terms of database
# data is taken from another service by api
return remote_api.request_user_name(self.uid) or 'Anonymous'
def activate(self):
# method now has a side effect (send message to user)
self.status = 'activated'
self.save()
send_mail('Your account is activated!', '…', [self.email])
我想要的是在代码中分离实体:
数据库级别的数据库实体:什么包含我的应用程序?
我的应用程序的实体,业务逻辑级别:什么可以构成我的应用程序?
有什么好的实践来实现可以在Django中应用的方法?