Использование SQLAlchemy ORM для фильтрации запроса на основе одного объекта в отношениях многие-к-одному - PullRequest
1 голос
/ 08 января 2020

Итак, у меня есть таблица carts и еще одна таблица cart_items. Корзина связана с элементом корзины следующим образом (в псевдокоде).

cart: cart_id = 1

cart_item: id = 12, cart_id = 1, in_stock = False

cart_item: id = 13, cart_id = 1, in_stock = False

cart_item: id = 14, cart_id = 1, in_stock = False

Я хочу запросить все carts, которые имеют хотя бы один cart_item со значением in_stock True.

cart: cart_id = 1

cart: cart_id = 2

cart_item: id = 12, cart_id = 1, in_stock = False

cart_item: id = 13, cart_id = 1, in_stock = False

cart_item: id = 14, cart_id = 1, in_stock = False

cart_item: id = 15, cart_id = 2, in_stock = True

cart_item: id = 16, cart_id = 2, in_stock = False

cart_item: id = 17, cart_id = 2, in_stock = False

Таким образом, с учетом этого набора данных будет возвращена корзина с cart_id = 2.

Кроме того, я должен упомянуть, что знаю, что мог бы запрашивать и извлекать все объекты, а затем работать над этим. список, чтобы отфильтровать все, что не соответствует этому требованию, но на самом деле мне нужно получить эти данные в форме запроса из-за того, как в этом веб-приложении обрабатывается нумерация страниц.

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

@property
def cart_has_in_stock(self):
    has_in_stock = False
    for item in self.cart.items:
      if item.in_stock:
        has_in_stock = True
    return has_in_stock

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

Запрос: select * from cart_items where cart_items.cart_id IN (select cart.id from cart_items as item INNER JOIN carts AS cart on item.cart_id = cart.id where item.stage = 'stock' group by cart.id) \G;

1 Ответ

0 голосов
/ 09 января 2020

Я понял это.

sub_q = model.Session.query(model.Cart.id).\
        join(model.CartItem, model.Cart.id == model.CartItem.cart_id).\
        filter(
            model.CartItem.stage == 'stock'
        ).\
        group_by(model.Cart.id).\
        subquery()

correct_q = model.Session.query(model.Cart).filter(model.Cart.id.in_(sub_q))

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