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

标签 python sqlalchemy flask flask-sqlalchemy

我正在构建一个具有可选 Facebook 登录功能的网络应用程序。在我的应用程序中,通过 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 模型并为每个用户获取正确的对象。

我考虑过破解元类以添加 FacebookPerson 作为基础。显然我想避免这种巫术。

我正在使用 Flask 和 Flask-SQLAlchemy。

最佳答案

总体思路是将模型的类名作为元数据存储在每一行中,当您实例化对象时,执行如下操作:

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()

如果您希望它是通用的,以便元数据对非 Python 客户端有意义,则不要存储模型的类名,而是存储模型的“object_type”,并在每个客户端库中包含将 object_types 映射到类的内容。

关于python - 如何根据行信息决定实例化哪个声明性模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6426267/

相关文章:

python - 模板中的 Flask matplotlib 图形

python - 使用ctypes函数在python中绑定(bind)键事件

python - 如何使用 Python 使用 Selenium 抓取 Linkedin 上的“下一步”按钮?

python - 安装 PythonForS60 时出现证书错误

python - bach linux 文件重命名 - 如何在 Linux 控制台中重命名多个文件

python - 多个模型上的 Alembic 迁移

python - SQLAlchemy 相当于 SQL "LIKE"语句

flask - 错误绑定(bind)参数 0 - 可能是不受支持的类型。 u'插入到 "Contacts"

python - 如何在 Python 中模拟 SendGrid 方法

python - SQLAlchemy db.create_all() 演示失败