2010-05-30 14 views
20

Desidero aggiungere una nuova funzione al modello Utente predefinito di Django per recuperare un elenco correlato di tipo Modello.Django Modello utente, aggiunta funzione

Tale modello 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() 

Come può essere raggiunto?

+1

correlati: [Estendere il modello User con campi personalizzati in Django] (http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) – miku

+2

Aware, ma non voglio aggiungere campi personalizzati, solo un funzione senza alterare il modello utente originale. – Hellnar

+1

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

risposta

35

È possibile aggiungere un metodo alla User

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

assicurarsi che, si dispone di questo codice all'interno del models.py o qualche altro file che viene importato in l'avvio di Django.

+6

Sono abbastanza sicuro che questo è patch di scimmia è è generalmente disapprovato. Vedi la discussione qui: http://stackoverflow.com/a/965859/406157 –

+1

OneToOneField è sicuramente il modo in cui questo dovrebbe essere gestito. –

+0

@DerekAdair Stiamo parlando di aggiungere un * metodo * alla classe. L'uso di 'OneToOneField' comporta la modifica del database, che non è necessario al 100% per raggiungere l'obiettivo di aggiungere un metodo. – Louis

8

Questo è un aggiornamento della risposta di @Lakshman Prasad. Ma un esempio completo:

creare un file monkey_patching.py in qualsiasi della vostra 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 nel file di app __init__.py. cioè ::

#app/__init__.py 
import monkey_patching 
+0

Voto in rialzo.Grazie per aver migliorato la risposta per renderlo completo. –

0

Non è insolito per sostituire il modello utente come si afferma nella documentazione: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, quindi, avendo questo in considerazione, è meglio per ottenere la classe del modello utente con il seguente codice:

Successivamente, è possibile utilizzare questo UserModel per aggiungere funzionalità come @Lakshman Prasad suggerisce: UserModel.add_to_class('get_related_foo_models', get_related_foo_models).


al fine di ottenere il codice eseguito solo una volta io preferisco usare le classi applicazione di configurazione Django (https://docs.djangoproject.com/es/1.9/ref/applications/), quindi un esempio di lavoro completo sarà:

# 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) 
Problemi correlati