2010-05-30 12 views
20

Ich möchte dem Standardbenutzermodell von Django eine neue Funktion hinzufügen, um eine verwandte Liste von Modelltypen abzurufen.Django Benutzermodell, Funktion hinzufügen

Solche Foo Modell:

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

Wie dies erreicht werden kann?

+1

Verwandte: [Erweiterung des User-Modell mit benutzerdefinierte Felder in Django] (http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) – miku

+2

Bewusst, aber ich möchte nicht benutzerdefinierte Feld hinzufügen, nur ein Funktion, ohne das ursprüngliche Benutzermodell zu ändern. – Hellnar

+1

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

Antwort

35

Sie eine Methode zum

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

Stellen Sie sicher,

User hinzufügen können, müssen Sie den Code innerhalb des models.py oder eine andere Datei, die in der Start von django importiert wird.

+6

Ich bin mir ziemlich sicher, dass Affe Patching ist ist im Allgemeinen verpönt. Siehe Diskussion hier: http://Stackoverflow.com/a/965859/406157 –

+1

OneToOneField ist definitiv die Art, wie dies behandelt werden sollte. –

+0

@DerekAdair Wir sprechen über das Hinzufügen einer * Methode * zur Klasse. Die Verwendung eines 'OneToOneField' erfordert das Ändern der Datenbank, was 100% unnötig ist, um das Ziel des Hinzufügens einer Methode zu erreichen. – Louis

8

Dies ist ein Update der Antwort von @Lakshman Prasad. Aber ein vollständiges Beispiel:

eine Datei monkey_patching.py in einem Ihrer apps erstellen ::

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

und importieren Sie es in der App __init__.py Datei. dh ::

#app/__init__.py 
import monkey_patching 
+0

Up Abstimmung.Danke für die Verbesserung der Antwort, um es zu vervollständigen. –

0

Es ist nicht ungewöhnlich Benutzermodell zu ersetzen, wie es in der Dokumentation angegeben: https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, so, mit diesem Umstand Rechnung, ist es besser, die Benutzermodell-Klasse mit dem folgenden Code zu erhalten:

Anschließend können Sie diese UserModel verwenden, um Funktionen wie @Lakshman Prasad schlägt vor: UserModel.add_to_class('get_related_foo_models', get_related_foo_models).


Um nur der Code ausgeführt werden, wenn ich es vorziehen Klassen Django-Anwendung Konfiguration verwendet werden (https://docs.djangoproject.com/es/1.9/ref/applications/), so dass ein voll funktionierendes Beispiel sein:

# 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) 
Verwandte Themen