2011-05-02 42 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內部創建的那個 – 2011-05-02 12:25:29

回答

2

如果我有一個用戶模塊,我導入了幾個項目,我會把這個共享模塊作爲基地來構建我的應用程序。

所以,你可能有一個包含baseuser.py模塊:

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

然後在每個GAE項目,你將有:

from baseuser import UserModel 

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

你會那麼可以自由每個應用程序擴展您的用戶模型,將所有共享邏輯保存在一個地方。

0

所有的應用程序是否共享一個數據庫?在這種情況下,您不能將UserProfile存儲爲用戶模型的字段,因爲用戶並不總是具有關聯的配置文件。我會讓用戶成爲UserProfile的一個字段,然後讓它指向那個方向(UserProfile包含一個用戶),並且創建UserProfile的user字段的索引,以便快速查找給定用戶的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,但我不確定會發生什麼(就數據庫而言)。

+0

我不需要應用程序來共享任何數據。這只是一個可重用的庫,可以在我的新應用程序中快速實現用戶功能。這個想法是我想要爲任何應用程序擁有任意數量的附加字段及其名稱。這就是爲什麼我不想在庫內部定義UserProfile模型,而是在新創建的應用程序代碼中的某處。 – 2011-05-02 12:44:33

1

因此,在任何單一的應用程序,這可能是一對一的關係。因此,您可以隨意存儲參考。你可以簡單地修改您的用戶配置模式,用戶參考:

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

然後,控制器:

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

這裏是你指定用戶弱譜參考。這不是必需的,如果你填充它,它不一定是一個特定的模型。這使您可以選擇存儲配置文件參考而不會破壞兼容性。

最後,您可以完全跳過配置文件,然後讓您的用戶對象an Expando