Запросы по атрибуту или связанному атрибуту с помощью SQLAlchemy - PullRequest
0 голосов
/ 09 ноября 2018

Моя абстракция: Книга имеет только одного пользователя (от имени автора ) и отношения "многие ко многим" с пользователем ( как соавторы ):

class UserBook(Base):
    __tablename__ = 'user_book'
    user_id = Column(String(512), ForeignKey('user.id'), primary_key=True)
    book_id = Column(String(512), ForeignKey('book.id'), primary_key=True)
    collaboration_type = Column(Integer, default=1)
    book = relationship('Book', back_populates='users')
    user = relationship('User', back_populates='books')


class User(Base):
    __tablename__ = 'user'

    id = Column(String(512), primary_key=True)
    books = relationship('UserBook', back_populates='user')


class Book(Base):
    __tablename__ = 'book'

    id = Column(String(512), primary_key=True)
    author = Column(String(512), ForeignKey('user.id'), nullable=False)
    collaborators = relationship('UserBook', back_populates='book')
    name = Column(String(512))
    description = Column(String(512), default='')

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

Мне удалось объединиться с соавтором, но я не уверен, как или с авторским фильтром.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать оператор or_ со своим фильтром, чтобы получить все книги, где текущий пользователь является автором или соавтором.Например:

from sqlalchemy import or_


curr_id = 'current_user_id'

session.query(Book).\
    outerjoin(UserBook).\
    filter(or_(Book.author == curr_id, UserBook.user_id == curr_id)).\
    all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...