как ограничить / сместить результат отношения sqlalchemy orm? - PullRequest
9 голосов
/ 05 февраля 2012

в случае, если у меня есть пользователь Модель и статья Модель, пользователь и статья имеют отношение один ко многим.так что я могу получить доступ к статье, подобной этой

user = session.query(User).filter(id=1).one()
print user.articles

, но при этом будут перечислены все статьи пользователя, что если я захочу ограничить количество статей до 10?в рельсах есть метод all(), который может иметь ограничение / смещение.в sqlalchemy также есть метод all(), но без параметров, как этого добиться?

Редактировать:

кажется user.articles[10:20] допустимым, но sql не использовал10/20 в запросах.так на самом деле он будет загружать все сопоставленные данные и фильтровать в Python?

1 Ответ

12 голосов
/ 22 июня 2012

Решение заключается в использовании отношения dynamic, как описано в разделе методов настройки коллекции в документации по SQLAlchemy.

Указав отношение как

class User(...):
    # ...
    articles = relationship('Articles', order_by='desc(Articles.date)', lazy='dynamic')

затем вы можете написать user.articles.limit(10), который сгенерирует и выполнит запрос для извлечения пользователем последних десяти статей. Или вы можете использовать синтаксис [x:y], если хотите, который автоматически сгенерирует предложение LIMIT.

Производительность должна быть разумной, если вы не хотите запрашивать последние десять статей для примерно 100 пользователей (в этом случае на сервер будет отправлено не менее 101 запроса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...