【问题标题】:How can I decide which declarative model to instantiate, based on row information如何根据行信息决定要实例化哪个声明性模型
【发布时间】:2011-09-19 13:19:30
【问题描述】:

我正在构建一个具有可选 Facebook 登录的 web 应用程序。在我的应用程序中,通过 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。

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案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()
    

    如果你希望它是通用的,以便元数据对非 Python 客户端有意义,而不是存储模型的类名,存储模型的“object_type”并在每个客户端库中都有一些将 object_types 映射到类的东西。

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多