Почему отношения автоматической загрузки SQLAlchemy/Pydantic выполняются только иногда, а не всегда?Python

Программы на Python
Anonymous
Почему отношения автоматической загрузки SQLAlchemy/Pydantic выполняются только иногда, а не всегда?

Сообщение Anonymous »

У меня возникла странная проблема в моем приложении на основе FastAPI, использующем SQLAlchemy и Pydantic с базой данных Postgres.
A Пользовательская модель содержит два разных отношения «1 ко многим». По неизвестным причинам первая связь всегда загружается автоматически, хотя этого и не должно происходить. Второе соотношение работает должным образом.
Мои модели:

Код: Выделить всё

class User(Base):
__tablename__ = "user"

id = Column(UUID(as_uuid=True), primary_key=True, default=uuid7, unique=True, nullable=False)
email = Column(String, unique=True, index=True)
hashed_password = Column(String)
is_active = Column(Boolean, default=True)

items = relationship("Item", back_populates="owner", lazy="select")
datastreams = relationship("DataStream", back_populates="owner", lazy="select")

class Item(Base):
__tablename__ = "item"

id = Column(UUID(as_uuid=True), primary_key=True, default=uuid7, unique=True, nullable=False)
title = Column(String, index=True)
description = Column(String, index=True)
owner_id = Column(UUID(as_uuid=True), ForeignKey("user.id"))

owner = relationship("User", back_populates="items")

class DataStream(Base):
__tablename__ = "data_stream"

id = Column(UUID(as_uuid=True), primary_key=True, default=uuid7, unique=True, nullable=False)
name = Column(String, index=True)
description = Column(String, index=True)
type = Column(data_stream_type_enum, nullable=False)  # Enum for type: 'folder' or 'stream'
parent_id = Column(UUID(as_uuid=True), ForeignKey("data_stream.id"), nullable=True)  # Self-referencing foreign key
owner_id = Column(UUID(as_uuid=True), ForeignKey("user.id"))

owner = relationship("User", back_populates="datastreams")

# Self-referential relationship for parent/child hierarchy
parent = relationship("DataStream", remote_side=[id], backref="children")
Мой уровень CRUD содержит, среди прочего, эти две функции:

Код: Выделить всё

def get_user(db: Session, user_id: UUID):
return db.query(models.User).filter(models.User.id == user_id).first()

def get_users(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.User).offset(skip).limit(limit).all()
Конечная точка API ответит по следующей схеме:

Код: Выделить всё

class User(UserBase):
id: UUID
is_active: bool
items: list[Item] = []
dataStreams: list[DataStream] = []

class Config:
orm_mode = True
Конечные точки выглядят следующим образом:

Код: Выделить всё

@router.get("/", response_model=list[user_schemas.User])
def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
users = crud.get_users(db, skip=skip, limit=limit)
return users

@router.get("/{user_id}", response_model=user_schemas.User)
def read_user(user_id: UUID, db: Session = Depends(get_db)):
db_user = crud.get_user(db, user_id=user_id)
if db_user is None:
raise HTTPException(status_code=404, detail="User not found")
return db_user
Ответ API всегда содержит полностью загруженное отношение Items, но не отношение DataStreams, хотя они существуют и связаны с одним и тем же идентификатором владельца. .

Код: Выделить всё

[
{
"email": “xxx@yyy”,
"id": "066fbcc7-61ff-7359-8000-440710dffadc",
"is_active": true,
"items": [
{
"title": "string",
"description": "string",
"id": "066fc123-237d-73e4-8000-bc6b98e36cfa",
"owner_id": "066fbcc7-61ff-7359-8000-440710dffadc"
},
{
"title": "string",
"description": "string",
"id": "066fc149-10bc-7569-8000-a629cd4d7e52",
"owner_id": "066fbcc7-61ff-7359-8000-440710dffadc"
}
],
"dataStreams": []
}
]
Мои вопросы:
  • Почему элементы загружаются автоматически, а потоки данных — нет?< /li>
    Как избежать автоматической загрузки элементов?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -not-alway

Вернуться в «Python»