【问题标题】:Best way to add convenience methods to a Django Auth User model?向 Django Auth User 模型添加便利方法的最佳方法?
【发布时间】:2010-12-21 13:15:45
【问题描述】:

我想为django.contrib.auth.models.User 模型添加一个便利/模型方法。这样做的最佳做法是什么,因为上次我检查时,扩展用户模型被认为是不好的做法。

我有一个单独的自定义 UserProfile 模型。我应该将它用于所有与用户相关的便捷方法吗?

【问题讨论】:

    标签: django django-models django-authentication


    【解决方案1】:

    是的。当您的用户模型附加了 .get_profile() 函数时,无需弄乱基础。

    【讨论】:

    • +1,仍然不推荐扩展 User 模型,并且配置文件的所有管道都已经可以使用。
    • 您可以在配置文件模型上添加OneToOne 字段并调用user_instance.profile 而不是使用get_profile()
    【解决方案2】:

    我更喜欢在我开发的各种项目中使用相同的 UserProfile,并扩展 User 以满足任何项目特定的需求。因此,通用功能转到 UserProfile,项目特定功能转到自定义用户。我还没有对子类化 User 模型产生任何不利影响,我想知道 Django 1.0+ 是否仍然存在任何不利影响。

    【讨论】:

      【解决方案3】:

      这取决于您要添加到模型中的内容。如果你想添加更多关于用户的信息,那么一般建议你使用UserProfile方法:http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

      但是,如果您只是想将自定义方法或管理器添加到 User 模型中,我会说使用代理模型更合乎逻辑,如下所示:

      from django.contrib.auth.models import User
      
      class UserMethods(User):
        def custom_method(self):
          pass
        class Meta:
          proxy=True
      

      代理模型将在与原始模型相同的数据库表上运行,因此非常适合创建自定义方法而无需物理扩展模型。只需将您视图中对User 的任何引用替换为UserMethods。 (当然,您可以通过取消注册 User 模型并注册您的代理模型来在管理工具中使用它。)

      创建的原始User 模型的任何实例都可以通过UserMethods 模型立即访问,反之亦然。更多内容:http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

      (注意,代理模型需要 Django 1.1 及更高版本)

      【讨论】:

      • 好电话!完全忘记了代理模型。我正在运行 1.1,但正在以 1.0 的心态思考。
      • 有没有一种简单的方法可以将 request.user 的类型更改为代理类型?有必要吗,或者我可以直接在 request.user 上调用代理方法吗?
      • 我和@slacy 有同样的疑问,并在这个答案上找到了方法:stackoverflow.com/a/11526049/188614。基本上,你必须继承 django.contrib.auth.backends.ModelBackend,在 get_user 上返回 UserMethods,然后在 AUTHENTICATION_BACKENDS 上设置它。
      • 这个指向 Django 文档的链接现在已损坏。有人知道新网址吗?
      【解决方案4】:

      2013 年更新:

      在 1.5 中,您可以替换自定义用户模型并添加您想要的任何内容https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user

      【讨论】:

        【解决方案5】:

        如果你想为 User 模型添加自定义方法,我推荐monkey_patching

        在您的任何apps:: 中创建一个文件monkey_patching.py

        #app/monkey_patching.py
        from django.contrib.auth.models import User 
        
        def get_user_name(self):
            if self.first_name or self.last_name:
                return self.first_name + " " + self.last_name
            return self.username
        
        User.add_to_class("get_user_name",get_user_name)
        

        并将其导入应用程序的__init__.py 文件。即::

        #app/__init__.py
        import monkey_patching
        

        【讨论】:

          猜你喜欢
          • 2017-12-27
          • 1970-01-01
          • 2013-12-20
          • 2014-05-30
          • 1970-01-01
          • 1970-01-01
          • 2016-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多