Таким образом, в любом отдельном приложении это, по-видимому, отношение один к одному. Таким образом, произвольно, где вы храните ссылку. Вы можете просто изменить свою модель UserProfile для ссылки на пользователя:
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()
В качестве альтернативы, если вы хотите, чтобы ссылка размещалась на объекте User, но не ломала приложения, которые не поддерживают профиль, вы можете сделать это:
class User(db.Model):
email = db.EmailProperty()
password = db.StringProperty()
role = db.StringProperty(default=roles.USER)
profile = db.ReferenceProperty()
Здесь вы указываете слабую ссылку на профиль пользователя. Это не обязательно, и если вы его заполняете, это не обязательно должна быть конкретная модель. Это позволяет дополнительно хранить ссылку на профиль без нарушения совместимости.
Наконец, вы можете вообще пропустить профиль и просто сделать свой объект User Expando .