9π
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
2π
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).