如何根据行信息确定要实例化的声明性模型

时间:2011-06-21 13:42:23

标签: python sqlalchemy flask flask-sqlalchemy

我正在构建一个具有可选Facebook登录功能的webapp。通过Facebook API创建的用户在我的应用程序中的几个点处理不同。我希望将这些差异封装在覆盖方法的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_id,只是查询Person模型并为每个用户获取正确的对象。

我曾想过将黑名单添加为Facebook基础的黑客。显然我想避免这样的伏都教。

我正在使用Flask和Flask-SQLAlchemy。

1 个答案:

答案 0 :(得分:1)

一般的想法是将模型的类名存储为每行中的元数据,并在实例化对象时执行以下操作:

def query(self):
    # stuff
    return model_class(data)

要在SQLAlchemy中执行此操作,您可能会将Person设置为BasicPerson和FacebookPerson以及Person。 init ()之类的基类,使用元数据初始化为正确的子类。

例如,这个想法将比这个查询返回时的想法,用户将被初始化为正确的子类:

user = session.query(Person).filter_by(name='james').first()

您可能需要为SQLAlchemy稍微修改一下这个概念(我暂时没有使用它),但这是一般的想法。

或者,您可以使用user_id将元数据存储在cookie中,然后当他们再次登录时,使用元数据将正确的类传递给用户查询:

user = session.query(FacebookPerson).filter_by(name='james').first()

如果您希望这是通用的,以便metatdata对非Python客户端有意义,而不是存储模型的类名,则存储模型的“object_type”,并在每个客户端库中有一些将object_types映射到类的东西。 / p>