使用Django用户模型还是创建自己的模型?

4 投票
4 回答
2391 浏览
提问于 2025-04-16 13:53

我现在正在设计一个基于Django的网站。为了简单起见,我们假设这是一个简单的社区网站,用户可以登录并给其他用户写消息。

我现在面临的选择是使用内置的用户模型,还是自己创建一个。我对内置的User需求不多:没有用户名(你的电子邮件地址就是你的用户名),但你可以设置一个内部名称,多个用户可以使用这个名称(就像Facebook那样)。另外,我不需要权限系统,因为访问其他用户不会基于小组。所以我最终只会使用内置User的电子邮件、名字、姓氏和密码字段,其他的内容会放在一个用户资料中。

另一方面,内置的用户系统在网站的后台会很有用,因为我可能需要一个基于小组的权限系统。

总的来说,我觉得我更倾向于自己创建一个用户模型,只在后台管理时使用内置的系统。

我的想法有什么问题吗?

4 个回答

1

你可能想看看最近创建的django-primate这个项目:https://github.com/aino/django-primate

我之前做过一个自定义用户模型,是从默认的用户模型继承过来的。虽然它可以正常工作,但我不太推荐这样做。

2

作为django-primate的作者,我想补充一些意见。django-primate这个工具可以让你轻松修改内置的用户模型,正是为了这个目的。如果你需要一些额外的功能,可以使用django-primate。

不过,这里有一些问题,虽然我认为修改django的用户模型本身并没有问题。一个问题是“用户”的类型差别很大,管理员用户和其他普通用户往往没有关系。这可能会导致一些麻烦,比如当管理员登录后想以“普通用户”的身份再登录网站时,他们并不希望这两个账户是关联的,也不希望自己会自动以管理员身份登录。这会让人感到困扰。此外,实施推荐的关联Profile模型也会带来很多麻烦,你通常需要确保每个Profile都有一个对应的用户,每个用户也要有一个Profile,特别是如果你想使用认证装饰器的话。处理“用户”的表单和管理界面会让这个过程变得更加复杂。总之:在这个过程中,通常会在某个环节出错,这真是个麻烦事

我大多时候已经放弃了使用contrib用户模型,除了管理员之外。其实你真正想要的是构建一个新的用户模型,但你也需要为这个用户提供认证功能,因此很多人错误地使用django的contrib用户模型。如果你遇到这样的情况,最好的解决办法是为这个自定义用户模型构建自己的认证系统。其实这并不难,我非常推荐这种方法。我认为官方的建议是错误的,应该在django中内置一些好的工具来支持自定义用户模型的认证。

9

我的反思有什么问题吗?

有。

我现在的选择是使用内置的用户模型,还是自己创建一个。

其实还有第三个选择。

http://docs.djangoproject.com/en/1.2/topics/auth/#storing-additional-information-about-users

其他所有信息都可以放在用户资料里。

没错。

我可以自己创建一个用户模型,只用内置的来访问后台管理。

别自己创建。

你应该这样做:

如果你想存储与用户相关的额外信息,Django 提供了一种方法,可以为此指定一个特定于网站的相关模型,这个模型称为“用户资料”。

撰写回答