Skip to main content

Model serializer for SQLModel

Project description

sqlmodel-serializers

DRF like SQLModel serializer which allows us to create valid response schemes and easily add dynamic fields in responses

Installation

pip install sqlmodel-serializers

Usage

from sqlmodel_serializers import SQLModelSerializer


from .models import Hero


class HeroUpdate(SQLModelSerializer):
    class Meta:
        model = Hero

        optional = '__all__'

        fields = ('name', 'secret_name', 'age')


class HeroRead(SQLModelSerializer):
    id: int
    full_name: str

    class Meta:
        model = Hero


class HeroCreate(SQLModelSerializer):
    class Meta:
        model = Hero

        fields = ('name', 'secret_name', 'age')

Now you can create your routes like this:

from typing import List

from sqlmodel import Session, select
from fastapi import FastAPI, HTTPException, status

from .models import engine, Hero, create_tables
from .serializers import HeroRead, HeroCreate, HeroUpdate


app = FastAPI()


@app.on_event("startup")
def on_startup():
    create_tables(engine)


@app.post("/heroes", response_model=HeroRead)
def create_hero(data: HeroCreate):
    hero = Hero(**data.dict())

    with Session(engine) as session:
        session.add(hero)

        session.commit()

        session.refresh(hero)

        return hero


@app.get("/heroes", response_model=List[HeroRead])
def read_heroes():
    with Session(engine) as session:
        heroes = session.exec(select(Hero)).all()
        return heroes


@app.get('/heroes/pk', response_model=HeroRead)
def retrieve_hero(pk: int):
    with Session(engine) as session:
        instance  = session.get(Hero, pk)

        if not instance:
            raise HTTPException(
                detail='Hero not found',
                status_code=status.HTTP_404_NOT_FOUND
            )

        return instance

@app.patch('/heroes/{pk}', response_model=HeroRead)
def update_hero(pk: int, data: HeroUpdate):
    with Session(engine) as session:
        instance  = session.get(Hero, pk)

        if not instance:
            raise HTTPException(
                detail='Hero not found',
                status_code=status.HTTP_404_NOT_FOUND
            )

        hero_data = data.dict(exclude_unset=True)

        for key, value in hero_data.items():
            setattr(instance, key, value)

        session.add(instance)

        session.commit()

        session.refresh(instance)

        return instance

This results in these schemes

Schemes

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sqlmodel-serializers-0.0.2.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

sqlmodel_serializers-0.0.2-py3-none-any.whl (5.8 kB view details)

Uploaded Python 3

File details

Details for the file sqlmodel-serializers-0.0.2.tar.gz.

File metadata

  • Download URL: sqlmodel-serializers-0.0.2.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for sqlmodel-serializers-0.0.2.tar.gz
Algorithm Hash digest
SHA256 699ed64d615e360ea3f42fd12aa5bc4dbd04bfd56c284d31cc1745a8dc6dad17
MD5 aa0b38c193c37888ea96f61b2b30b233
BLAKE2b-256 06dd31ca4860aad855f35eac90e9f15e52f5d6a8e83f34cba9c24e05637bb97f

See more details on using hashes here.

File details

Details for the file sqlmodel_serializers-0.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for sqlmodel_serializers-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b941c4439c6765437b4673b3b63f5bbb2d3da8ffd71f715d7c9e3cd41c9ff7ac
MD5 53d16dbc81590b3bea75a7c0791a6fad
BLAKE2b-256 bac3036ae097acb3ba14bd539eb80e1dce8a50b6d7c8feb4c6c1891925d7a85b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page