Extending User object in Django: User model inheritance or use UserProfile?

自闭症网瘾萝莉.ら 提交于 2019-12-03 02:57:42

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

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).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!