Похожие чаты

Привет, пытаюсь решить проблему, никак не получается, помогите пожалуйста. Приложение

FastAPI использующее SQLAlchemy_2.0
Есть функция возвращающая Shift c загруженными предварительно связанными Member.user и Member.reports. Которая использует для этого рекомендованный метод selectinload Необходимо изменить её так, чтобы возвращались связанные данные только тех Member, у которых Member.user.is_test_user == False

Модели:

class Shift(Base):
__tablename__ = "shifts"
reports = relationship("Report", back_populates="shift")
members = relationship("Member", back_populates="shift")

class User(Base):
__tablename__ = "users"
members = relationship("Member", back_populates="user")
is_test_user = Column(Boolean, default=False, nullable=False)

class Member(Base):
__tablename__ = "members"
status = Column(String(10))
user_id = Column(UUID(as_uuid=True), ForeignKey(User.id), nullable=False)
user = relationship("User", back_populates="members")
shift_id = Column(UUID(as_uuid=True), ForeignKey(Shift.id), nullable=False)
shift = relationship("Shift", back_populates="members")
reports = relationship("Report", back_populates="member")

class Report(Base):
__tablename__ = "reports"
shift_id = Column(UUID(as_uuid=True), ForeignKey(Shift.id), nullable=False)
shift = relationship("Shift", back_populates="reports")
member_id = Column(UUID(as_uuid=True), ForeignKey(Member.id), nullable=False)
member = relationship("Member", back_populates="reports")

Функция:

async def get_with_members(self, id: UUID, member_status: Optional[str]) -> Shift:
member_stmt = Shift.members
if member_status:
member_stmt = member_stmt.and_(Member.user == member_status)
statement = (
select(Shift)
.where(Shift.id == id)
.options(selectinload(Shift.members).selectinload(Member.user))
.options(selectinload(Shift.members).selectinload(Member.reports))
)
request = await self._session.execute(statement)
return request.scalars().first()

Попытки изменить member_stmt == Shift.members.and_(Member.user.is_test_user==False), вызывают исключение: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Member.user has an attribute 'is_test_user'. Возможно необходимо использовать вместо selectinload() обычный join() совместно contains_eager() или subqueryload() ?

7 ответов

11 просмотров

Кол на пастбин или гист, а то много, тут не воспринимается

Eugene-Che Автор вопроса
Eugene Che
https://pastebin.com/px0Pn7JY

Я бы сделал джоином

Eugene Che
https://pastebin.com/px0Pn7JY

А не, ты хочешь чтобы при этом запросе в релейшене были отфильтрованы по полю?

Eugene-Che Автор вопроса

Да необходимо отсечь тех Members у которых есть связь с User, который, в свою очередь имеет поле User.is_test_user == True

Eugene-Che Автор вопроса
Fred Bernardo
Тогда да, джоин и два условия в where

statement = ( select(Shift) .join(Shift.members) .where(Shift.id == id, User.is_test_user == False) .options(contains_eager(Shift.members)) ) Изменил statement таким образом, теперь раизится greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place.

Похожие вопросы

Обсуждают сегодня

А кто-то пробовал, уезжая из Эстонии получить э-рез и продолжить вести предпринимательскую деятельность внутри Эстонии, используя свой OÜ?
Lalalashechki Lalala
62
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Чем оно проблема?
Nikita Uzumaki
21
Hi, I was reading this https://twitter.com/HouseofChimera/status/1778078991762780408 about Verasity and their likely choice of Tron as blockchain for their token for its low f...
Jordi
13
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
@samkazemian - couple questions: Update on frxBTC? - This would do well with the current influx of institutional investment entering the space Update on future veFXS streams...
Costi
16
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Подобного рода ;Следующие три строки это директивы ассемблера, ;которые можно не задавать, т.к.работаем в Visual Studio. ;Символ ";" - это начало однострочного комментария ...
Егор Анелькин
3
Does anyone here have a connection Mullvad? it would be nice to know what it would take to have them accept BCH 0-conf.
tl121x
16
I arrived here after a Chico Crypto show highlighted the project & the Team - the fact that the Team had a long history of successfully working with household names gave me e...
Banter is Bullish
5
Карта сайта