1

この質問にタイトルを付ける方法がわかりません。また、コードを簡略化したので、質問しやすくなりました。Pyramidのmyproject.modelsに次のコードがあるとします。

class Links(Base):
    __tablename__ = 'links'
    id = Column(Integer, primary_key=True)
    link = Column(Text)

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

class Submissions(Base):
    __tablename__ = 'submissions'
    id = Column(Integer, primary_key=True)
    title = Column(Text)
    link_id = Column(Integer, ForeignKey('links.id'))
    link = relationship(Links)

    def __init__(self, title, link):  
    self.title = title
        self.link = link

ビューは非常に単純になります。

def my_view(request):
    dbsession = DBSession()
    submissions = dbsession.query(Submissions)
    return {'submissions':submissions}

カメレオンを使用してこれを自分のページに返したい:

<p tal:repeat="thing submissions">
    ${thing.title} ${thing.link}
</p>

ただし、${thing.link}にはサイトのリンクは表示されません。

質問:

  1. things.linkのリンクを参照するにはどうすればよいですか?直感的には${thing.link.link}と入力しますが、それは機能しません。
  2. 任意のサブクラスを参照するにはどうすればよいですか?オブジェクトのサブクラスから任意の属性を抽出できるようにしたい(たとえば、thing.link.link、thing.link.domain、thing.link.createdなど)。

ところで、誰かがこの質問をするためのより良いタイトルを教えてください。

4

2 に答える 2

2

あなたの例では、あなたはあなたの.all()後に欠けています.query()。次のような操作を行うことで、提出物が実際に読み込まれているかどうかをビューで確認できます。

for submission in submissions:
    print submission.id, submission.title

次に、ページをロードするときにコンソールを監視します。

次に、実際にロードされていることを確認したら、を使用してリンクオブジェクトにアクセスできますsubmission.link。リンクオブジェクトでは、。を使用してリンク属性にアクセスできます.link

for submission in submissions:
    print submission.link.link

したがって、テンプレートに、と書くことができます${thing.link.link}

于 2011-09-22T14:13:15.910 に答える
0

linkオブジェクトがアタッチされていると仮定すると(link_id列がアタッチされていないという事実を前提として)、ビューにデータを入力するとセッションが既に閉じられているため、nullableおそらくと(eager)loadの関係が必要になります。 詳細については、リレーションシップローディングテクニックを参照してください。以下のコードはそれを行う必要があります:Links

submissions = dbsession.query(Submissions).options(joinedload('link'))
于 2011-09-22T07:22:14.857 に答える