質問

ActivereCordの「has_many:sull」モデルの関係に精通している人はいますか?私は本当にレールの男ではありませんが、それは基本的に私がやろうとしていることです。

考慮された例として、プロジェクト、プログラマー、および割り当てを考慮してください。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import Integer, String, Text
from sqlalchemy.orm import relation

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Assignment(Base):
    __tablename__ = 'assignment'
    id = Column(Integer, primary_key=True)
    description = Column(Text)

    programmer_id = Column(Integer, ForeignKey('programmer.id'))
    project_id = Column(Integer, ForeignKey('project.id'))

    def __init__(self, description=description):
        self.description = description

    def __repr__(self):
        return '<Assignment("%s")>' % self.description

class Programmer(Base):
    __tablename__ = 'programmer'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))

    assignments = relation("Assignment", backref='programmer')

    def __init__(self, name=name):
        self.name = name

    def __repr__(self):
        return '<Programmer("%s")>' % self.name

class Project(Base):
    __tablename__ = 'project'
    id = Column(Integer, primary_key=True)
    name = Column(String(64))
    description = Column(Text)

    assignments = relation("Assignment", backref='project')

    def __init__(self, name=name, description=description):
        self.name = name
        self.description = description

    def __repr__(self):
        return '<Project("%s", "%s...")>' % (self.name, self.description[:10])

engine = create_engine('sqlite://')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

プロジェクトには多くの割り当てがあります。

プログラマーには多くの割り当てがあります。 (控えめな表現?)

しかし、少なくとも私のオフィスでは、プログラマーも多くのプロジェクトを持っています。プログラマに割り当てられた割り当てを通じてこの関係を推測したいと思います。

プログラマモデルに、割り当てモデルを通じてプログラマに関連するプロジェクトのリストを返す属性「プロジェクト」を持っていることを望みます。

me = session.query(Programmer).filter_by(name='clay').one()
projects = session.query(Project).\
    join(Project.assignments).\
    join(Assignment.programmer).\
    filter(Programmer.id==me.id).all()

この関係を明確かつ単にSQLALCHEMY宣言的構文を使用するにはどうすればよいですか?

ありがとう!

役に立ちましたか?

解決

私が見る2つの方法があります:

  1. 関係を定義します Programmer.projectssecondary='assignment'.

  2. 定義します Assignment.project 関係として Programmer.projects なので association_proxy('assignments', 'project') (おそらく、作成者を定義したいと思うでしょう)。見る アソシエーションオブジェクトの関係を簡素化します 詳細については章。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top