不确定如何设计Django应用 - 最佳实践
在我之前开发的每个Django应用中,我只用了一个应用,把所有的模型、表单等等都放在里面。对于小型应用来说,这样做还可以,但现在是时候好好做了 :)
我想要一个auth模块,来处理用户注册、登录、发送欢迎邮件等事情。
于是,我创建了一个叫做'auth'的应用。在auth.models模块里,我有这样的代码:
class BaseModel(models.Model):
uuid = UUIDField()
time_created = models.DateTimeField(auto_now_add=True, null=True)
time_modified = models.DateTimeField(auto_now=True, null=True)
class Meta:
abstract = True
class Team(BaseModel):
title = models.CharField(_('Team title'), max_length=64)
class Member(BaseModel):
user = models.OneToOneField(User)
team = models.ForeignKey(Team)
USER_ROLES = (
('admin',_('Administrator')),
('member',_('Team member')),
)
role = models.CharField(_('User role'), max_length=6, choices=USER_ROLES, default='member')
这时候我遇到了第一个问题。我的应用中的每个用户都会有一个一对一的Member对象。Member对象存储一些关于用户的额外信息。每个用户必须被分配到一个组(我称之为Team)……等等……难道Team类不应该放到一个单独的应用中去管理团队吗?
另外,我想让所有的模型类都继承自BaseModel。那我是不是需要在每个应用里都再加一遍这个BaseModel类?这不是违反了“不要重复自己”的原则吗?
还有,在注册新用户时,我需要为他创建一个新的Team。那这段代码应该放在哪里呢?这和用户管理以及团队管理都有关系。
我需要一些指导,来解决这些设计上的问题。
1 个回答
4
应用程序的设计目的是成为独立的“模块”,这些模块里的代码可以在未来的其他Django项目中重复使用。你可以问问自己,是否会想在其他项目中再次使用这段代码。
你扩展的用户模型和团队功能在我看来应该算是一个单独的应用。因为你并没有针对团队或成员定义特定于某个网站的行为。我也能想到很多情况下你会想要重复使用上面的代码。