Django:为什么要创建一个OneToOne到UserProfile而不是子类化auth.User?

jMy*_*les 9 django django-models django-contrib django-authentication django-users

注意:如果你想通过告诉我你不喜欢django.contrib.auth来回答这个问题,请继续.这没有用.我很清楚这个问题的意见范围和力度.

现在,问题是:

惯例是使用OneToOne to User创建一个模型UserProfile.

在我能想到的各种方式中,一种更有效和更有效的方法是将User子类化为一个打算用于系统中每个人的类 - 一个名为Person(User)的类.

我没有看到为什么前者是传统的而后者被视为黑客的连贯解释.不久之前,我改用了OneToOne方法,以便获得使用get_profile()的能力,从此我就后悔了.除非我能理解这种方法的优点,否则我正在考虑转回去.

Dan*_*man 4

您确实意识到,模型子类化是通过底层的 OneToOne 关系实现的,不是吗?事实上,就效率而言,我看不出这两种方法有什么区别。

在我看来,现有具体模型的子类化是一种令人讨厌的黑客行为,应该尽可能避免。它涉及隐藏数据库关系,以便不清楚何时执行额外的数据库访问。显式显示关系并在必要时显式访问它们会更加清晰。

现在,我喜欢的第三种选择是创建一个全新的用户模型,以及一个返回新模型实例而不是默认模型实例的自定义身份验证后端。创建后端只需要定义几个简单的方法,因此非常容易做到。