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

2024-04-27 02:40:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个有可选Facebook登录的webapp。在我的应用程序中,通过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_id,只需查询Person模型并为每个用户获取正确的对象。你知道吗

我已经考虑过破解元类来添加FacebookPerson作为基础。显然我想避免这种巫毒。你知道吗

我在用烧瓶和烧瓶炼金术。你知道吗


Tags: 用户selfidgetfacebookreturn烧瓶def
1条回答
网友
1楼 · 发布于 2024-04-27 02:40:54

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

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

要在SQLAlchemy中实现这一点,您可以考虑将Person作为BasicPerson和FacebookPerson之类的基类,并在Person中使用元数据初始化到适当的子类。你知道吗

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

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

对于SQLAlchemy,您可能需要稍微修改一下这个概念(我有一段时间没有使用它了),但这只是一般的想法。你知道吗

或者,您可以执行一些操作,例如将元数据存储在具有用户id的cookie中,然后当他们再次登录时,使用元数据将适当的类传递给用户查询:

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

如果希望它是泛型的,以便metatdata对非Python客户机有意义,则不存储模型的类名,而是存储模型的“object\u type”,并在每个客户机库中都有一些将object\u类型映射到类的内容。你知道吗

相关问题 更多 >