2013-07-16 20 views
6

SQLAlchemyで一般的なフィールドがどのように実装されているかを理解するのは本当に苦労しています。SQLAlchemy Generic Relationship単純な例

私はすべてのモデルタイプに関連するフィールドを含むPermissionsクラス/テーブルを持っています。

私は例を見てきましたし、このブログの記事http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-sqlalchemy/

は、それが別のテーブルのない一般的な関係を持つことは可能ですか? object_typeとidを保存するだけですか?これらの行に沿ったもの:

class Permission(AbstractBase): 
    user = relationship("User", backref=backref('permissions')) 
    permission_type = column(String()) 
    object = #The object the permission applies to, could be any type. 

私はちょうど本当に簡単な例が分かると思います!

また、私はジャンゴの背景から来ています!

おかげ

+0

「別のテーブルなし」とはどういう意味ですか?あなたのSQLスキーマの外観をよりよく定義できますか? –

+0

申し訳ありませんが私は自分自身を明確にすべきでした。別のテーブルがなければ、私は一般的な関係を格納するための別のテーブルを持つことを意味しました。 – Charlie

+1

これは、古いパターンの古いブログ記事ですが、最初の例である "どのようにレールがそれをする"は、ジャンゴのアプローチでもあります。余分なテーブルを必要とすることを避けるために、従来の外部キーの使い方は先決です。テーブルを保存するだけで間違ってスキーマを構築するのはなぜ重要なのですか? – zzzeek

答えて

1

は、他の誰かが後日について同じ質問をし、私はこの種のもののために我々が持っている三つの例を指摘だけでなく、私は(主に)行います新しい例を書いても同じことジャンゴsqlalchemy generic foreign key (like in django ORM)

+0

それは素晴らしいです、ありがとう。 – Charlie

5

sqlalchemy-utilsパッケージのgeneric_relationshipを使用することもできます(これは奇妙な "contenttypes"テーブルを除いています)。

ここにはexample for their documentationがあります。

from sqlalchemy_utils import generic_relationship 

class User(Base): 
    __tablename__ = 'user' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Customer(Base): 
    __tablename__ = 'customer' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Event(Base): 
    __tablename__ = 'event' 
    id = sa.Column(sa.Integer, primary_key=True) 
    object_type = sa.Column(sa.Unicode(255)) 
    object_id = sa.Column(sa.Integer) 
    object = generic_relationship(object_type, object_id) 
関連する問題