2011-05-02 9 views
3

나는 내 자신의 인증 및 사용자 시스템을 지원하는 모듈을 만들었습니다. 다른 응용 프로그램에서 사용하는 범용 모듈입니다. 이 모듈에서는 User 모델은 다음과 같이 설명되어 있습니다기존 모델에 모델 참조 추가

class User(db.Model): 
    email = db.EmailProperty() 
    password = db.StringProperty() 
    role = db.StringProperty(default=roles.USER) 

을 나는이 모듈을 사용하는 하나의 응용 프로그램에서이 같은이 응용 프로그램에 대한 특정 추가 필드를 설명하는 별도의 모델을 만들고 싶습니다 :

class UserProfile(db.Model): 
     first_name = db.StringProperty() 
     last_name = db.StringProperty() 
     company = db.StringProperty() 

는 그리고 난 내 새로 만든 응용 프로그램 내에서 UserProfile 모델 모델 User에 첨부해야합니다. 모든 응용 프로그램에 공통적 인 모듈 내부의 코드를 수정하지 않고 어떻게 할 수 있습니까?

+0

appengine에서 두 개의 서로 다른 응용 프로그램을 사용한다는 것을 의미합니까? 우리가 appengine 내부에서 생성하는 것을 의미합니다. –

답변

2

내가 여러 프로젝트에 걸쳐 가져온 사용자 모듈을 가지고있는 경우이 공유 모듈을 기본으로 처리하여 내 앱을 빌드해야합니다.그런 다음

class UserModel(db.Model): 
    email = db.EmailProperty() 
    password = db.StringProperty() 
    role = db.StringProperty(default=roles.USER) 

는 것이다 각 GAE 프로젝트 :

그래서 당신은 baseuser.py 모듈을 포함 할 수도 있습니다

from baseuser import UserModel 

class User(UserModel): 
    first_name = db.StringProperty() 
    last_name = db.StringProperty() 
    company = db.StringProperty() 

당신은 다음 응용 프로그램 당 사용자 모델을 확장 할 수없는 것, 그리고 모든 공유 논리를 한 곳에 보관하십시오.

0

모든 응용 프로그램이 데이터베이스를 공유합니까? 이 경우 사용자는 항상 연결된 프로필이 없으므로 UserProfile을 User 모델의 필드로 저장할 수 없습니다. 나는 UserProfile의 필드를 만들 것이고, 그 방법을 다시 지적 할 것이다. (UserProfile은 User를 포함한다.) 그리고 user의 UserProfile 필드를 인덱싱하여 주어진 사용자에 대한 UserProfile을 빠르게 찾을 수 있도록한다.

코드 재사용에 관심이 있지만 공통 데이터베이스를 공유하지 않는 경우 해당 추가 필드를 응용 프로그램을 기반으로 조건부로 만들 수 있습니다. 예 :

class User(db.Model): 
    email = db.EmailProperty() 
    password = db.StringProperty() 
    role = db.StringProperty(default=roles.USER) 
    if APP_HAS_USER_PROFILES: 
     first_name = db.StringProperty() 
     last_name = db.StringProperty() 
     company = db.StringProperty() 

그런 다음 마지막 세 필드는 특정 응용 프로그램에만 나타납니다. 나는 또한 UserProfile User로부터 상속받을 수 있다고 믿는다. 그렇지만 나는 (데이터베이스 측면에서) 어떻게되는지 모른다.

+0

어떤 데이터도 공유 할 필요가 없습니다. 이것은 새로운 애플리케이션에서 사용자 기능을 신속하게 구현할 수있는 재사용 가능한 라이브러리 일뿐입니다. 아이디어는 임의의 응용 프로그램에 대해 임의의 수의 추가 필드와 해당 이름을 갖기를 원합니다. 그래서 UserProfile 모델을 라이브러리 내부가 아니라 새로 생성 된 응용 프로그램의 코드 어딘가에 정의하려고합니다. –

1

단일 응용 프로그램 내에서 이것은 아마도 일대일 관계 일 것입니다. 따라서 참조를 저장하는 곳은 임의적입니다. 컨트롤러에서, 그리고

class UserProfile(db.Model): 
     user = db.ReferenceProperty(User) 
     first_name = db.StringProperty() 
     last_name = db.StringProperty() 
     company = db.StringProperty() 

: 당신은 단순히 사용자를 참조하여 USERPROFILE 모델을 수정할 수 있습니다

user = User.filter('email =', email).get() 
profile = UserProfile.filter('user =', user).get() 

또는, 당신은 사용자 개체에 살고 있지만 응용 프로그램을 중단하지 않는 참조를 원한다면 그 프로파일을 지원하지 않습니다, 당신이 할 수 있습니다 :

class User(db.Model): 
    email = db.EmailProperty() 
    password = db.StringProperty() 
    role = db.StringProperty(default=roles.USER) 
    profile = db.ReferenceProperty() 

다음은 사용자에 약한 프로필 참조를 지정하고 있습니다. 필수 항목은 아니며, 채우면 특정 모델 일 필요는 없습니다. 따라서 선택적으로 호환성을 유지하면서 프로파일 참조를 저장할 수 있습니다.

마지막으로 프로필을 건너 뛰고 User 개체를 an Expando으로 만들 수 있습니다.

관련 문제