首页 文章

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

提问于
浏览
16

要使用自定义字段扩展User对象,Django文档建议使用UserProfiles . 但是,根据this回答一年左右的问题回复:

扩展django.contrib.auth.models.User现在也运行得更好 - 自从Django的继承代码在模型API中重构以来 .

诸如this等文章阐述了如何使用自定义字段扩展User模型以及优势(直接从用户对象检索属性,而不是通过.get_profile()) .

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

2 回答

  • 8

    我投票赞成使用 UserProfiles .

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

    Example:

    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方式 .

    UPDATE May, 2013

    从Django 1.5开始,您可以使用默认的用户模型,或使用完全自定义模型的substitute .

    UPDATE Nov, 2016

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

  • 2

    这是James Bennett在_1371453中所说的内容:

    我敢打赌,通过定义一个相关的模型并将其与一个唯一的外键链接起来,可能会有90%或更多人说他们想要用子类做的事情 .

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

相关问题