fastcrud icon indicating copy to clipboard operation
fastcrud copied to clipboard

Add endpoint-specific join_config support to crud_router

Open igorbenav opened this issue 2 months ago • 1 comments

Discussed in https://github.com/benavlabs/fastcrud/discussions/247

Originally posted by seklmco September 3, 2025 Hello. To start off, I have to admit this library is an amazing time saver so thank you for creating it.

I want to learn about how to define a custom response model at the router level (crud_router). I see that there is the select_schema parameter. However, when I define it to be something like LibraryRead, it is trying to read a relationship field from the database, which does not exists. Take a look at these models as an example (I'm using sqlmodel):

class LibraryBase(SQLModel):
    name: str = Field()

class Library(LibraryBase, table=True):
    id: str = Field(primary_key=True)
    books: list[Book] = Relationship(back_populates='libraries')

class LibraryRead(LibraryBase):
    id: str
    books: list[Book]

I would then want LibraryRead to be the response model so FastAPI can automatically respond with the appropriate data. With FastAPI, I would define the endpoint like this and the books list would be included in the response:

@router.get("", response_model=LibraryRead
def get_libraries(...):
    libraries = get_libraries(...) # Returns a list of Library objects
    return libraries # FastAPI automatically returns list of LibraryRead objects because of the response_model

However, when I set the select_schema to LibraryRead, it looks like it is attempting to read books from the database. Which I suppose makes sense but not the functionality I am looking for.

library_router_ = crud_router(
    session=get_async_session,
    model=Library,
    crud=FastCRUD(Library),
    path="/libraries",
    tags=["Library"],
    select_schema=LibraryRead
)

If I don't set select_schema then the response, as expected, only includes id and name fields.

Let me know what I am missing. Thank you!

igorbenav avatar Nov 07 '25 08:11 igorbenav

I'll be taking this one for now

LucasQR avatar Nov 17 '25 20:11 LucasQR