Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
✨ Add new SQLModel models
  • Loading branch information
tiangolo committed Nov 24, 2023
commit 8890edf15c9e9af01f2024348a34ae036cdd2799
82 changes: 82 additions & 0 deletions src/backend/app/app/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
from typing import Union

from pydantic import BaseModel, EmailStr
from sqlmodel import Field, Relationship, SQLModel


# Shared properties
class UserBase(SQLModel):
email: EmailStr = Field(unique=True, index=True)
is_active: bool = True
is_superuser: bool = False
full_name: Union[str, None] = None


# Properties to receive via API on creation
class UserCreate(UserBase):
password: str


# Properties to receive via API on update, all are optional
class UserUpdate(UserBase):
email: Union[EmailStr, None] = None
password: Union[str, None] = None


# Database model, database table inferred from class name
class User(UserBase, table=True):
id: Union[int, None] = Field(default=None, primary_key=True)
hashed_password: str
items: list["Item"] = Relationship(back_populates="owner")


# Properties to return via API, id is always required
class UserOut(UserBase):
id: int


# Shared properties
class ItemBase(SQLModel):
title: str
description: Union[str, None] = None


# Properties to receive on item creation
class ItemCreate(ItemBase):
title: str


# Properties to receive on item update
class ItemUpdate(ItemBase):
title: Union[str, None] = None


# Database model, database table inferred from class name
class Item(ItemBase, table=True):
id: Union[int, None] = Field(default=None, primary_key=True)
title: str
owner_id: Union[int, None] = Field(
default=None, foreign_key="user.id", nullable=False
)
owner: Union[User, None] = Relationship(back_populates="items")


# Properties to return via API, id is always required
class ItemOut(ItemBase):
id: int


# Generic message
class Msg(BaseModel):
msg: str


# JSON payload containing access token
class Token(BaseModel):
access_token: str
token_type: str


# Contents of JWT token
class TokenPayload(BaseModel):
sub: Union[int, None] = None