Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据行信息决定实例化哪个声明性模型_Python_Sqlalchemy_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 如何根据行信息决定实例化哪个声明性模型

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

我正在构建一个具有可选Facebook登录的Web应用程序。在我的应用程序中,通过FacebookAPI创建的用户在几个方面的处理方式都不同。我想将这些差异封装在覆盖方法的
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_类型映射到类的内容