full-stack-fastapi-template icon indicating copy to clipboard operation
full-stack-fastapi-template copied to clipboard

Question: Unable to get related fields when using GET method

Open kgorshkoff opened this issue 4 years ago • 2 comments

Hi there, I'm trying to get some related fields via GET method, but when I try it I only get default value e.g null. Maybe there's someone who can explain where I'm wrong?

I'm getting the Item object in swagger, but without SupplierItem and Images relations.

models\item.py

class Item(Base):
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    article = Column(String, index=True)
    description = Column(String, index=True)

    vat_id = Column(Integer, ForeignKey("vat.id"))
    vat = relationship("Vat")

    manufacturer_id = Column(Integer, ForeignKey("manufacturer.id"))
    manufacturer = relationship("Manufacturer", back_populates="items")

    unit_id = Column(Integer, ForeignKey("unit.id"))

    price = relationship("Price", back_populates="item")
    images = relationship("Image", back_populates="item")
    supplier_items = relationship("SupplierItem", back_populates="item")

    is_active = Column(Boolean, default=True)

models\supplier_item.py

class SupplierItem(Base):
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True, unique=True)
    is_active = Column(Boolean, default=True)

    price = relationship("Price", back_populates="supplier_item")

    supplier_id = Column(Integer, ForeignKey("supplier.id"))
    supplier = relationship("Supplier", back_populates="supplier_items")

    item_id = Column(Integer, ForeignKey("item.id"))
    item = relationship("Item", back_populates="supplier_items")

schemas\item.py

class ItemBase(BaseModel):
    id: int
    title: Optional[str] = None
    description: Optional[str] = None
    article: Optional[str] = None
    manufacturer: Optional[Manufacturer] = None
    unit: Optional[Unit] = None
    price: Optional[List[Price]] = None
    vat: Optional[Vat] = None
    image: Optional[List[Image]] = None
    supplier_item: Optional[List[SupplierItem]] = None

endpoints\items.py

@router.get("/{id}", response_model=schemas.Item)
def read_item(
        *,
        db: Session = Depends(deps.get_db),
        id: int,
        current_user: models.User = Depends(deps.get_current_active_user),
) -> Any:
    """
    Get item by ID.
    """
    item = crud.item.get(db=db, id=id)
    if not item:
        raise HTTPException(status_code=404, detail="Item not found")
    if not crud.user.is_superuser(current_user):
        raise HTTPException(status_code=400, detail="Not enough permissions")
    return item

kgorshkoff avatar Mar 24 '21 08:03 kgorshkoff

In schemas do we have Item class?

I see you only mentioned ItemBase class.

If not...

response_model should be schemas.ItemBase

we-shall avatar Mar 24 '21 08:03 we-shall

In schemas do we have Item class?

I see you only mentioned ItemBase class.

If not...

response_model should be schemas.ItemBase

Yes, I've simpled everything down to one base class and just inherited everything else.

kgorshkoff avatar Mar 24 '21 08:03 kgorshkoff