Модель пользователя Django, добавление функции
Я хочу добавить новую функцию к модели пользователя 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()
Как это можно достичь?
Ответы
Ответ 1
Вы можете добавить метод в User
from django.contrib import auth
auth.models.User.add_to_class('get_related_foo_models', get_related_foo_models)
Убедитесь, что у вас есть этот код в файле models.py или другом файле, который импортируется при запуске django.
Ответ 2
Это обновление ответа @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)
и импортировать его в файл app __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)