1

オプションの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を使用しています。

4

1 に答える 1

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をクラスにマップするものを用意します。

于 2011-06-29T10:58:50.457 に答える