【问题标题】:Django User model, adding functionDjango用户模型,添加功能
【发布时间】:2011-02-25 18:21:47
【问题描述】:

我想在 Django 的默认用户模型中添加一个新函数,用于检索模型类型的相关列表。

这样的 Foo 模型:

class Foo(models.Model):
    owner = models.ForeignKey(User, related_name="owner")
    likes = models.ForeignKey(User, related_name="likes")

........

    #at some view
    user = request.user
    foos= user.get_related_foo_models()

如何做到这一点?

【问题讨论】:

标签: django django-models django-users


【解决方案1】:

你可以给User添加一个方法

from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)

确保您在 models.py 或其他在 django 启动时导入的文件中有此代码。

【讨论】:

  • 我很确定这是猴子补丁,通常是不受欢迎的。请参阅此处的讨论:stackoverflow.com/a/965859/406157
  • OneToOneField 绝对是应该处理的方式。
  • @DerekAdair 我们正在讨论向类添加一个方法。使用OneToOneField 需要修改数据库,这对于实现添加方法的目标是 100% 不必要的。
  • @Louis 仅仅因为你可以并不意味着你应该,这种方法有很多副作用。在某些情况下,这些副作用可以忽略不计,但 OneToOneField 是实现此目的的“正确”方式。我想我的评论的措辞会更好,例如“它几乎总是这样做的方式”。
  • @DerekAdair 你很难找到我的任何文章,其中我有一个论点是“你应该,因为你可以”。
【解决方案2】:

这是@Lakshman Prasad 答案的更新。但是一个完整的例子:

在您的任何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

【讨论】:

  • 支持投票。感谢您增强答案以使其完整。
【解决方案3】:

按照文档中的说明替换用户模型并不罕见:https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model,因此,考虑到这一点,最好使用以下代码获取用户模型类:

from django.contrib.auth import get_user_model
UserModel = get_user_model()

之后,您可以使用UserModel 添加功能,正如@Lakshman Prasad 建议的那样:UserModel.add_to_class('get_related_foo_models', get_related_foo_models)


为了让代码只执行一次,我更喜欢使用 Django 应用程序配置类 (https://docs.djangoproject.com/es/1.9/ref/applications/),所以一个完整的工作示例将是:

# myapp/__init__.py
default_app_config = 'myapp.apps.MyAppConfig'

# myapp/apps.py
from django.apps import AppConfig
from django.contrib.auth import get_user_model


class MyAppConfig(AppConfig):
    name = 'myapp'
    verbose_name = 'MyApp'

    def ready(self):
        # Add some functions to user model:
        def custom_function(self):
            # Do whatsoever
            pass

        UserModel = get_user_model()
        UserModel.add_to_class('custom_function', custom_function)

【讨论】:

猜你喜欢
  • 2016-04-17
  • 2015-06-29
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多