Python 如何根据行信息决定实例化哪个声明性模型
我正在构建一个具有可选Facebook登录的Web应用程序。在我的应用程序中,通过FacebookAPI创建的用户在几个方面的处理方式都不同。我想将这些差异封装在覆盖方法的Python 如何根据行信息决定实例化哪个声明性模型,python,sqlalchemy,flask,flask-sqlalchemy,Python,Sqlalchemy,Flask,Flask Sqlalchemy,我正在构建一个具有可选Facebook登录的Web应用程序。在我的应用程序中,通过FacebookAPI创建的用户在几个方面的处理方式都不同。我想将这些差异封装在覆盖方法的Person子类中 class Person(Model): def get_profile_picture(self): return profile_pictures.url(self.picture) class FacebookPerson(Person): def get_profi
Person
子类中
class Person(Model):
def get_profile_picture(self):
return profile_pictures.url(self.picture)
class FacebookPerson(Person):
def get_profile_picture(self):
return 'http:/.../%s.jpg' % self.graph_id
我希望避免讨厌的if self.graph\u id
,只需查询Person模型并为每个用户获取正确的对象
我曾想过破解元类以添加FacebookPerson作为基础。显然,我想避免这种巫毒
我在用烧瓶炼金术 一般的想法是将模型的类名作为元数据存储在每一行中,并且在实例化对象时,执行如下操作:
def query(self):
# stuff
return model_class(data)
要在SQLAlchemy中实现这一点,您可以考虑将Person作为BasicPerson和FacebookPerson之类的基类,并将其设置为Person。init(),使用元数据初始化为适当的子类
例如,当此查询返回时,用户将被初始化为适当的子类:
user = session.query(Person).filter_by(name='james').first()
对于SQLAlchemy,您可能需要稍微修改一下这个概念(我有一段时间没有使用它了),但这是一般的想法
或者,您可以使用用户id将元数据存储在cookie中,然后当他们再次登录时,使用元数据将适当的类传递给用户查询:
user = session.query(FacebookPerson).filter_by(name='james').first()
如果您希望它是通用的,以便metatdata对非Python客户机有意义,那么不要存储模型的类名,而是存储模型的“对象类型”,并且在每个客户机库中都有一些将对象类型映射到类的内容。一般的想法是将模型的类名作为元数据存储在每一行中,在实例化对象时,执行以下操作:
def query(self):
# stuff
return model_class(data)
要在SQLAlchemy中实现这一点,您可以考虑将Person作为BasicPerson和FacebookPerson之类的基类,并将其设置为Person。init(),使用元数据初始化为适当的子类
例如,当此查询返回时,用户将被初始化为适当的子类:
user = session.query(Person).filter_by(name='james').first()
对于SQLAlchemy,您可能需要稍微修改一下这个概念(我有一段时间没有使用它了),但这是一般的想法
或者,您可以使用用户id将元数据存储在cookie中,然后当他们再次登录时,使用元数据将适当的类传递给用户查询:
user = session.query(FacebookPerson).filter_by(name='james').first()
如果您希望这是通用的,以便metatdata对非Python客户机有意义,那么不要存储模型的类名,而是存储模型的“object_type”,并且在每个客户机库中都有将object_类型映射到类的内容