29

我想在 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()

如何做到这一点?

4

3 回答 3

45

您可以将方法添加到User

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

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

于 2010-05-31T13:06:58.610 回答
14

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

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

#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文件中。IE::

#app/__init__.py
import monkey_patching
于 2014-07-10T03:53:03.860 回答
4

正如文档中所述,替换用户模型并不罕见: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-02-08T14:09:22.500 回答