在django中扩展用户模型

时间:2011-03-18 05:08:58

标签: django django-models

http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

在扩展User模型时,上面的文章列出了两种方法:旧方法(ForeignKey)和新方式(具有继承的用户模型)。但与此同时,这篇文章的历史可以追溯到2008年8月。

我正在使用Django的开发版本。

您是否建议使用继承扩展Django User模型或使用ForeignKey?

我在几篇帖子中读到了不建议扩展django.contrib.auth.models.User的内容,所以我不会那么看。

3 个答案:

答案 0 :(得分:1)

AFAIK,更清晰的方法 - 如果它适合您的项目架构 - 是拥有一个独特的用户配置文件模型,并使用AUTH_PROFILE_MODEL设置将其链接到Django用户模型。

请参阅Django Doc about storing additional information for Users

答案 1 :(得分:1)

Dominique Guardiola是对的。使用AUTH_PROFILE_MODEL。 James Bennett在他的“Django in Depth”演讲中重申了这一点。 http://www.youtube.com/watch?v=t_ziKY1ayCo&feature=related大约1小时:37分钟。

  • 决定我们想要存放用户个人资料的应用程序,我们称之为BngGangOfFour。
  • 定义一个Model类,为了清楚起见,将其命名为UserProfile,并为其提供我们想要的额外字段。

BngGangOfFour / models.py

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User) #notice it must contain a 1 to 1 field with the auth user.
    last_ip_address = models.CharField(max_length=20, default="")
  • 编辑settings.py以将我们新创建的模型指定为用户个人资料。

settings.py

....
AUTH_PROFILE_MODULE = 'BngGangOfFour.UserProfile' #not case sensitive.
....
  • 直接从用户对象访问配置文件。

BngGangOfFour / views.py

....
def index(request):
    if request.user.get_profile().last_ip_address = "127.0.0.1":
        print("why hello me!")    
    return render_to_response('index.html', locals(), context_instance=RequestContext(request))
  • 喝一杯冰镇啤酒,然后叫它一天。

答案 2 :(得分:0)

如果你正在编写一个auth后端,而你将只能返回相应模型的实例,那么你唯一可以通过继承来彻底摆脱扩展User