2010-05-30 12 views
20

Quiero agregar una nueva función al modelo de usuario predeterminado de Django para recuperar una lista relacionada de tipo de modelo.Modelo de usuario de Django, función de adición

Dicho modelo 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() 

¿Cómo se puede lograr?

+1

relacionadas: [Ampliación del modelo de usuario con campos personalizados en Django] (http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) – miku

+2

Aware, pero no quiero agregar un campo personalizado, solo un funcionar sin alterar el modelo de Usuario original. – Hellnar

+1

http://docs.djangoproject.com/en/1.2/ref/models/relations/#django.db.models.fields.related.RelatedManager –

Respuesta

35

se puede añadir un método para la User

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

asegurarse, usted tiene el código dentro de la models.py o algún otro archivo, que se importa en el inicio de Django.

+6

Estoy bastante seguro de que esto es parche de mono es generalmente está mal visto. Consulte la discusión aquí: http://stackoverflow.com/a/965859/406157 –

+1

OneToOneField es definitivamente la forma en que esto debería manejarse. –

+0

@DerekAdair Estamos hablando de agregar un * método * a la clase. El uso de 'OneToOneField' implica la modificación de la base de datos, que es 100% innecesaria para lograr el objetivo de agregar un método. – Louis

8

Esta es una actualización de @Lakshman Prasad's answer. Pero un ejemplo completo:

crear un archivo monkey_patching.py en cualquiera de su 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) 

e importarlo en el archivo de aplicación __init__.py. es decir ::

#app/__init__.py 
import monkey_patching 
+0

Up Vote.Gracias por mejorar la respuesta para que sea completa. –

0

No es inusual para sustituir modelo de usuario, ya que se afirma en los documentos: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, por lo que, teniendo esto en cuenta, es mejor obtener la clase modelo de usuario con el siguiente código:

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

A continuación, puede utilizar este UserModel para agregar la funcionalidad como @Lakshman Prasad sugiere: UserModel.add_to_class('get_related_foo_models', get_related_foo_models).


Con el fin de conseguir el código que se ejecuta sólo una vez yo prefiero usar Django clases aplicación de configuración (https://docs.djangoproject.com/es/1.9/ref/applications/), por lo que un ejemplo de trabajo completo será:

# 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) 
Cuestiones relacionadas