2011-05-02 66 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