在 Django 中扩展 User 对象:用户模型继承还是使用 UserProfile?

发布于 2024-08-31 06:47:09 字数 717 浏览 7 评论 0原文

要使用自定义字段扩展 User 对象,Django 文档建议使用 用户个人资料。但是,根据这个答案大约一年前的一个问题:

自从在模型 API 中重构 Django 继承代码以来,扩展 django.contrib.auth.models.User 现在也工作得更好了。

以及诸如这样的文章 列出如何使用自定义字段扩展用户模型,以及优点(直接从用户对象检索属性,而不是通过 .get_profile())。

所以我想知道在这个问题上是否有任何共识,或者使用其中之一的理由。或者甚至 Django 团队目前的想法是什么?

To extend the User object with custom fields, the Django docs recommend using UserProfiles. However, according to this answer to a question about this from a year or so back:

extending django.contrib.auth.models.User also works better now -- ever since the refactoring of Django's inheritance code in the models API.

And articles such as this lay out how to extend the User model with custom fields, together with the advantages (retrieving properties directly from the user object, rather than through the .get_profile()).

So I was wondering whether there is any consensus on this issue, or reasons to use one or the other. Or even what the Django team currently think?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

囚你心 2024-09-07 06:47:09

我投票支持使用用户配置文件

我使用几个第三方应用程序。用户的外键将始终指向 auth.models.User。

示例:

class Article(models.Model):
    user = models.ForeignKey('auth.User') # instead of your CustomUser
    text = ....

您的自定义用户模型:

class CustomUser(User):
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

如果您通过 Article 实例访问用户字段,会发生什么?
这将引发一个异常:

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'

也许这对您来说不是问题,并且您不想避免额外的数据库查询。
但我会使用 get_profile 方式。

2013 年 5 月更新

从 Django 1.5 开始,您可以 扩展默认用户模型,或用完全定制的模型替代

更新2016年11月

以上解决方案已过时,请参阅wim的评论

I vote for using UserProfiles.

I use several thrid party apps. And a foreign key to a User will always Point to auth.models.User.

Example:

class Article(models.Model):
    user = models.ForeignKey('auth.User') # instead of your CustomUser
    text = ....

And your custom User model:

class CustomUser(User):
    timezone = models.CharField(max_length=50, default='Europe/London')

    # Use UserManager to get the create_user method, etc.
    objects = UserManager()

What will be happen if you access the user field through an Article instance?
This will raise an exception:

u = a_article.user
u.timezone

AttributeError: 'User' object has no attribute 'timezone'

Maybe this isn't a problem for you and you wan't to avoid the additional DB query.
But i would use the get_profile way.

UPDATE May, 2013

Since Django 1.5 you can extend the default User model, or substitute with a completely customized model.

UPDATE Nov, 2016

The above solution is obsolete, see the comment from wim

荒路情人 2024-09-07 06:47:09

以下是 James Bennett 在此 有关模型继承的博客条目

我敢打赌,人们所说的想要用子类做的事情中,可能有 90% 或更多可以通过定义相关模型并用唯一的外键将其链接回来来更好地完成。

所以我认为最好的方法仍然是使用外部应用程序,例如 Pinax 的某些组件,或者django-profiles 应用程序(最初来自同一 James Bennett)。

Here is what James Bennett says in this blog entry about model inheritance:

I’d wager that probably 90% or more of the things people say they want to do with subclasses could be better accomplished by instead defining a related model and linking it back with a unique foreign key.

So I believe the best way to go is still to use an external app, such as some components of Pinax, or the django-profiles app (originally from the same James Bennett).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文