2010-05-30 5 views
20

모델 유형의 관련 목록을 검색하기 위해 Django의 기본 User 모델에 새 기능을 추가하려고합니다.Django 사용자 모델, 추가 기능

이러한 푸 모델 :

#at some view 
    user = request.user 
    foos= user.get_related_foo_models() 

어떻게

이 달성 될 수

class Foo(models.Model): 
    owner = models.ForeignKey(User, related_name="owner") 
    likes = models.ForeignKey(User, related_name="likes") 

........?

+1

관련 : [와 사용자 모델을 확장 Django의 사용자 정의 필드] (http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django) – miku

+2

인식하지만 사용자 정의 필드를 추가하고 싶지는 않습니다. 원래 사용자 모델을 변경하지 않고 – Hellnar

+1

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

답변

35

당신은 User

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

에 확인하는 방법을 추가 할 수 있습니다, 당신은 models.py 또는 장고의 시작에서 수입됩니다 다른 파일 내에서이 코드가 있습니다.

+6

나는이 패치가 원숭이라고 확신한다. 일반적으로 눈살을 찌푸리게됩니다. 여기의 토론을 참조하십시오 : http://stackoverflow.com/a/965859/406157 –

+1

OneToOneField는 이것이 반드시 처리되어야하는 방법입니다. –

+0

@DerekAdair 클래스에 * 메서드 *를 추가하는 것에 대해 설명합니다. OneToOneField를 사용하면 데이터베이스 수정이 필요하며, 이는 메소드 추가의 목표를 달성하는 데 100 % 불필요합니다. – Louis

8

@Rakshman Prasad의 답변입니다. 그러나 전체 예 :

는 :: 당신의 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) 

을 파일 monkey_patching.py을 만들고 응용 프로그램의 __init__.py 파일에서 가져옵니다. 즉 ::

#app/__init__.py 
import monkey_patching 
+0

투표하십시오.답변을 작성해 주셔서 감사합니다. –

0

그것은 그것이 문서에 명시된대로 사용자 모델을 대체하는 이상한 아니다 : https://docs.djangoproject.com/es/1.9/topics/auth/customizing/#substituting-a-custom-user-model, 그래서 계정이 점을 가지고, 다음 코드로 사용자 모델 클래스를 얻기 위해 더 :

다음으로이 UserModel을 사용하여 @Lakshman Prasad가 제안한대로 기능을 추가 할 수 있습니다 : UserModel.add_to_class('get_related_foo_models', get_related_foo_models). 나는 (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)