Files
MetaORM/docs/guide/tables-dto.md
2026-08-17 14:22:34 +03:00

65 lines
1.7 KiB
Markdown

# Tables & DTOs
## BaseTable
`BaseTable[ItemType]` is a generic `SQLModel` subclass that acts as the database table. It is the bridge between your database and your application code.
### Without DTO mapping
If you don't need a separate data-transfer object, use `BaseTable` directly:
```python
class UserTable(BaseTable, table=True):
__tablename__ = "users"
id: int | None = Field(default=None, primary_key=True)
name: str
email: str = Field(unique=True)
```
Repository methods will return `UserTable` instances directly.
### With DTO mapping
When you want repository methods to return a separate Pydantic model instead of the raw table, specify a generic argument and implement `from_item` / `to_item`:
```python
from pydantic import BaseModel
from metaorm import BaseTable, Field
class User(BaseModel):
id: int | None = None
name: str
email: str
class UserTable(BaseTable[User], table=True):
__tablename__ = "users"
id: int | None = Field(default=None, primary_key=True)
name: str
email: str = Field(unique=True)
@classmethod
def from_item(cls, item: User) -> "UserTable":
return cls(id=item.id, name=item.name, email=item.email)
def to_item(self) -> User:
return User(id=self.id, name=self.name, email=self.email)
```
Then pass `dto=User` to the repository:
```python
class UserRepository(BaseRepository, table=UserTable, filter_=UserFilter, dto=User):
pass
```
`BaseTable` also provides `to_values()` for insert / update operations.
## Introspection helpers
- `get_table_type()` — returns the SQLModel table class.
- `get_filter_type()` — returns the filter class.
- `get_dto_type()` — returns the DTO class or `None`.