Skip to main content

Pagination for Tortoise-ORM on FastAPI

Project description

Usage

Supposing in myapp.schema you have a pydantic BaseModel to represent your model

from fastapi import Depends
from tortoise_pagination import Pagination, Page

from myapp.main import app
from myapp.models import MyModel
from myapp.schema import MySchema


@app.get('/mymodel')
async def my_view(pagination: Depends(Pagination.from_query)) -> Page[MySchema]:
    return await pagination.paginated_response(MyModel.all(), MySchema)

now you can request with:

curl http://localhost:8000/mymodel?offset=0&limit=20

returned structure:

  • items list[MySchema]
  • count: NonNegativeInt -> the number of entries for this queryset (MyModel.all().count()) wich the frontend will need to be able to display a pagination

Computed field

Sometime you may want to add computed fields, however pydantic is not async capable so sometime it may become a challenge to achieve that we do:

from fastapi import Depends
from fastapi.routing import APIRouter
from myapp.models import Product
from tortoise.contrib.pydantic import pydantic_model_creator

from tortoise_pagination import Page, Pagination

ProductBaseSchema = pydantic_model_creator(Product, include=("id", "price", "weight"))


class ProductSchema(ProductBaseSchema):
    name: str
    price_per_kilogram: float | None


router = APIRouter(prefix="products")


async def _compute_price_per_kilogram(product: Product) -> float | None:
    try:
        return product.price / product.weight
    except ZeroDivisionError:
        return None


@router.get("")
async def list_products(
    pagination: Depends(Pagination.from_query),
) -> Page[ProductSchema]:
    products = Products.all()
    return await pagination.get_custom_paginated_response(
        queryset=products,
        schema=ProductSchema,
        extra_fields={
            "name": lambda product: product.name.title(),
            "price_per_kilogram": _compute_price_per_kilogram,
        },
    )

Lazy schema

It's possible to build a custom schema from the extra fields definition

from tortoise_pagination import build_pydantic_model_with_extra_fields


def _get_name(product: Product) -> str:
    return product.name.title()


async def _compute_price_per_kilogram(product: Product) -> float | None:
    try:
        return product.price / product.weight
    except ZeroDivisionError:
        return None


EXTRA_FIELDS = {
    "name": _get_name,
    "price_per_kilogram": _compute_price_per_kilogram
}

# This model will have `name` and `price_per_kilogram` with the other fields
# note that you must have return annotation types in given function for extra
# fields, otherwise Any will be used (ex for lambda functions).
ProductWithExtraFieldsSchema = build_pydantic_model_with_extra_fields(
    ProductSchema,
    "ProductWithExtraFields",
    EXTRA_FIELDS,
)

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

tortoise_pagination-1.2.12.tar.gz (3.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tortoise_pagination-1.2.12-py3-none-any.whl (4.1 kB view details)

Uploaded Python 3

File details

Details for the file tortoise_pagination-1.2.12.tar.gz.

File metadata

  • Download URL: tortoise_pagination-1.2.12.tar.gz
  • Upload date:
  • Size: 3.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.4 CPython/3.12.7 Linux/6.12.0-arch1-1

File hashes

Hashes for tortoise_pagination-1.2.12.tar.gz
Algorithm Hash digest
SHA256 73dcea4eaeaf62dbae1cf0ccf52566de3da2ee2733db0b5dd204ac7d124372af
MD5 639932ae05eb01765ae7f7d99b4a7144
BLAKE2b-256 26e47fbdf52c4659924685690106af5c92b0df70d2fde31ed2391a27ab7cba2a

See more details on using hashes here.

File details

Details for the file tortoise_pagination-1.2.12-py3-none-any.whl.

File metadata

File hashes

Hashes for tortoise_pagination-1.2.12-py3-none-any.whl
Algorithm Hash digest
SHA256 88730b4415aa35473bd8fc29c315bb76640005b9b31011e82c4bf83d38428582
MD5 35a944387d350b8ccdebc75c00f8841f
BLAKE2b-256 e92b54fe05edb4a60671a642b0db01d792578e9e5e2a352462b58e857578edd4

See more details on using hashes here.

Supported by

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