litestar-org/litestar

Docs: example in "DTO: Excluding fields" is not clear

sobolevn opened this issue · 1 comments

Summary

Example:

config = DTOConfig(
    exclude={
        "id",
        "address.id",
        "address.street",
        "pets.0.id",
        "pets.0.user_id",
    }
)

Later is specifies:

and "pets.0.id" and "pets.0.user_id" represent fields of the Pets objects nested within the list of User.pets.

and

Given a generic type, with an arbitrary number of type parameters (e.g., GenericType[Type0, Type1, ..., TypeN]), we use the index of the type parameter to indicate which type the exclusion should refer to. For example, a.0.b, excludes the b field from the first type parameter of a, a.1.b excludes the b field from the second type parameter of a, and so on.

But I still don't understand what pets.0.id means :)

Here are my questions:

  1. Is pets.0 an index of an object? For example in [Pet(id=1, name="Dog"), Pet(id=2, name="Cat")] will both of them not have an id? Or only Dog?
  2. This sentence confuses me even more:

Given a generic type, with an arbitrary number of type parameters (e.g., GenericType[Type0, Type1, ..., TypeN]), we use the index of the type parameter to indicate which type the exclusion should refer to

Because neither User or Pet is generic. They don't have any type params.

I don't have any proposals on how to fix this, because I don't understand how it works :)


Note

While we are open for sponsoring on GitHub Sponsors and
OpenCollective, we also utilize Polar.sh to engage in pledge-based sponsorship.

Check out all issues funded or available for funding on our Polar.sh dashboard

  • If you would like to see an issue prioritized, make a pledge towards it!
  • We receive the pledge once the issue is completed & verified
  • This, along with engagement in the community, helps us know which features are a priority to our users.
Fund with Polar

Adding a partial explanation with a sample (and incomplete) model.

class Pets(Base):
    name: Mapped[str]
    user_id: Mapped[UUID] = mapped_column(ForeignKey("user.id"))

class User(Base):
    pets: Mapped[list[Pets]] = relationship(info=dto_field("read-only"))

UserDTO = SQLAlchemyDTO[User]
config = DTOConfig(
    exclude={
        "id",
        "address.id",
        "address.street",
        "pets.0.id",
        "pets.0.user_id",
    }
)
ReadUserDTO = SQLAlchemyDTO[Annotated[User, config]]

Is pets.0 an index of an object? For example in [Pet(id=1, name="Dog"), Pet(id=2, name="Cat")] will both of them not have an id? Or only Dog?

Both of them.

This sentence confuses me even more:

The 0 in pets.0.id is not indicative of the index in which it has to exclude an attribute, rather it indicates the index of the type in list[Pets] (because this is the type of User.pets), so 0 here refers to Pets.