У меня есть модель «многие-ко-многим», такая как пресловутые пользователи и группы:
users_groups_table= Table('users_in_groups', Base.metadata,
Column('group_id', Integer(), ForeignKey('group.id'), primary_key=True),
Column('user_id', Integer(), ForeignKey('user.id'), primary_key=True)
class User(Base):
__tablename__ = 'user'
id = Column(Integer(), primary_key=True)
groups = relationship("Group", secondary=users_groups_table, backref="members")
class Group(Base):
__tablename__ = 'group'
id = Column(Integer(), primary_key=True)
Итак, в конечном итоге, я запрашиваю одну из них и хочу указать, когда известный экземпляр другой присутствует во взаимосвязи.
Я мог бы сделать что-то вроде:
user = session.query(User).get(known_user_id)
groups = session.query(Group).all()
for g in groups:
if user in g.members:
# ...
Однако я чувствую, что в конечном итоге это приведет к выполнению запроса для каждой группы, чтобы получить список пользователей, что может быть огромным списком, и провести в нем тест, когда достаточно информации известно с самого начала, и я думаю, что все это можно было бы сформировать более эффективно.
Думаю, я мог бы запросить группы пользователей принадлежит однажды, и проверьте, входит ли каждая группа в этот набор. Но это лучшее решение? Что делать, если существует ТОННЫ групп, и я просматриваю только подмножество в моем запросе?
Я просто чувствую, что мне не хватает лучшего способа структурировать начальный запрос, чтобы получить именно те данные, которые я хочу без в результате получается элемент pythoni c в тестах списка для каждого элемента.
Например:
Допустим, у меня есть сложный запрос и возвращаются группы с идентификаторами: [100, 500, 999] . И предположим, что пользователь является членом # 500, и всех от # 1000 до # 10000000. Я хочу вернуть что-то вроде:
(group<id 1>, false)
(group<id 500>, true)
(group<id 999, false)