开发者

Referencing a related object in Pyramids/Python/SQLAlchemy

开发者 https://www.devze.com 2023-04-06 18:37 出处:网络
I\'m not sure how to title this question. I\'ve also simplified my code so it\'s easier to ask. Say I have the following code in myproject.models in Pyramid:

I'm not sure how to title this question. I've also simplified my code so it's easier to ask. Say I have the following code in myproject.models in Pyramid:

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

The view will be very simple:

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

I want to return this on my page using Chameleon:

<p tal:repeat="thing submissions">
    ${thing.title} ${thing.link}
</p>开发者_Python百科;

However, ${thing.link} doesn't show the link of the site.

Questions:

  1. How do I reference thing.link's link? Intuitively, I would type ${thing.link.link}, but that doesn't work.
  2. How do I reference an arbitrary subclass? I want to be able to extract any attribute from an object's subclass, for example, thing.link.link, thing.link.domain, thing.link.created, etc.

BTW, someone please tell me a better title to give this question.


In your example, you are missing the .all() after your .query(). You can check in your view if your submissions are really loaded by doing something like

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

and then watch your console when loading the page.

Then, when you confirmed you really have them loaded, you can access the link object with submission.link. In the link object, you can access the link attribute with .link.

for submission in submissions:
    print submission.link.link

So in your template, you could write ${thing.link.link}.


Assuming you do have the link object attached (given the fact that the link_id column is not nullable), most probably you need to (eager)load the relationship to Links because the session is alread closed when you populate your view.
See Relationship Loading Techniques for more information. The code below should do it:

submissions = dbsession.query(Submissions).options(joinedload('link'))
0

精彩评论

暂无评论...
验证码 换一张
取 消