在 Django 中扩展 User 对象:用户模型继承还是使用 UserProfile?
要使用自定义字段扩展 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我投票支持使用用户配置文件。
我使用几个第三方应用程序。用户的外键将始终指向 auth.models.User。
示例:
您的自定义用户模型:
如果您通过 Article 实例访问用户字段,会发生什么?
这将引发一个异常:
也许这对您来说不是问题,并且您不想避免额外的数据库查询。
但我会使用 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:
And your custom User model:
What will be happen if you access the user field through an Article instance?
This will raise an exception:
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
以下是 James Bennett 在此 有关模型继承的博客条目:
所以我认为最好的方法仍然是使用外部应用程序,例如 Pinax 的某些组件,或者django-profiles 应用程序(最初来自同一 James Bennett)。
Here is what James Bennett says in this blog entry about model inheritance:
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).