Django Модель пользователя, функция добавления - PullRequest
24 голосов
/ 30 мая 2010

Я хочу добавить новую функцию в пользовательскую модель 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()

Как этого достичь?

Ответы [ 3 ]

39 голосов
/ 31 мая 2010

Вы можете добавить метод к User

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

Убедитесь, что у вас есть этот код в файле models.py или в другом файле, который импортируется при запуске django.

12 голосов
/ 10 июля 2014

Это обновление ответа @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 приложения. то есть ::

#app/__init__.py
import monkey_patching
1 голос
/ 08 февраля 2016

Нередко заменять пользовательскую модель, как указано в документации: 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)
...