SQLAlchemy и Pyramid, как вывести ресурсы из контекста? - PullRequest
5 голосов
/ 08 декабря 2011

У меня проблема с намоткой головы на мое веб-приложение Pyramid.У меня она очень похожа на ту, что описана Майклом Мерикелем здесь , за исключением того, что я использую чистый обход, чтобы найти свои взгляды.(Они объявлены настроенными с context = 'path.toResource' name = 'myView'), довольно стандартная плата за проезд в соответствии с тем, что я могу сказать из прохождения вики. Хотя мое приложение имеет более сложную структуру URL: Мои ресурсы пользователя находятся под /users/{user_id}, а мои проекты под /projects/{project_id}.Все мои ресурсы сохраняются с использованием SQLAlchemy ORM;У меня есть класс User и Project с атрибутами __name__ и __parent__, а также другие атрибуты, расширяющие столбцы.

class User(Base):
    id = Column(...)
    __name__ = None
    __parent__ = None
Class Project(Base):
    id = Column(...)
    __name__ = None
    __parent__ = None
    owner_id = Column(...ForeignKey(User.id))
    owner = relationship(User,...)

У меня есть RootFactory, ProjectFactory и UserFactory, которые заполняют соответствующие атрибуты __name__ и __parent__ в их вызовах __get_item__.

Итак, в функциях представления дляКонтекст проекта, я получаю экземпляр проекта в request.context.Моя проблема, как, черт возьми, я ссылаюсь на соответствующий экземпляр пользователя?Я не могу создать project.owner, потому что этот экземпляр User не проходил через цепочку RootFactory, поэтому его значения __parent__ и __name__ не установлены.Это плохо, потому что я хочу использовать request.resource_url, чтобы найти URL для владельца-пользователя, чтобы я мог разместить ссылку на странице просмотра.

Какое решение здесь ТАК?Я делаю все через request.root?Что если я хочу сделать сложный запрос, который возвращает экземпляры User или Project?Есть ли какой-нибудь CrapFactory, который я могу передать SQLAlchemy, чтобы все его экземпляры были правильно заполнены?

Является ли мой подход совершенно неправильным?

Я чувствую, что у меня не возникло бы таких проблем, если бы я просто застрял с маршрутизацией URL ...

1 Ответ

5 голосов
/ 08 декабря 2011

Это проблема, с которой все сталкиваются, пытаясь смешать SQLAlchemy с обходом. Требование обхода заключается в наличии устойчивой древовидной структуры, которую вы можете пройти, чтобы перейти от одного узла к другому.

У вас есть 2 варианта.

  1. Вы можете построить фактическое дерево в своей базе данных, где каждый ресурс знает, где он находится. Таким образом, когда вы загружаете ресурс, у него есть некоторый способ определить его родителя и имя. Это лучший вариант. Обычно это делается путем создания таблицы ресурсов с собственной ссылкой в ​​вашей базе данных. Тогда оба ваших объекта User и Project будут иметь resource_id внешние ключи, которые они могут использовать для определения своего местоположения в дереве.

  2. Ваше имя и родитель в настоящее время заполняются только при прохождении дерева от корня, поэтому вы можете делать все через request.root, чтобы ссылаться на другие части дерева.

Также можно просто определить свойство __resource_url__ для каждого ресурса, но в большинстве случаев это тоже довольно странно.

Важно отметить, что существует большая разница в том, чтобы сказать «мои URL имеют эту структуру» и в действительности создать постоянную иерархию этой структуры, которую вы можете использовать. Для обработки URL-адресов это довольно просто, но для генерации их может быть болезненно без постоянного дерева.

...