Ссылка на связанный объект в Pyramids / Python / SQLAlchemy - PullRequest
1 голос
/ 22 сентября 2011

Я не уверен, как озаглавить этот вопрос.Я также упростил свой код, чтобы его было проще задавать.Скажем, у меня есть следующий код в myproject.models в 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

Вид будет очень простым:

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

Я хочу вернуть это на своей странице, используя Chameleon:1007 *

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

Однако $ {thing.link} не показывает ссылку на сайт.

Вопросы:

  1. Как мне ссылаться на thing.link'sссылка на сайт?Интуитивно я бы набрал $ {thing.link.link}, но это не сработало.
  2. Как мне сослаться на произвольный подкласс?Я хочу иметь возможность извлечь любой атрибут из подкласса объекта, например, thing.link.link, thing.link.domain, thing.link.created и т. Д.

Кстати, кто-то, пожалуйстаскажи мне лучшее название, чтобы задать этот вопрос.

Ответы [ 2 ]

2 голосов
/ 22 сентября 2011

В вашем примере вы пропускаете .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}.

0 голосов
/ 22 сентября 2011

Если у вас есть прикрепленный объект link (учитывая тот факт, что столбец link_id не nullable), скорее всего вам нужно (eager)load отношение к Links, поскольку сеанс уже закрыт.когда вы заполняете свое представление.
См. Методы загрузки отношений для получения дополнительной информации.Код ниже должен сделать это:

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